1. 程式人生 > >java中抽象類,介面,多型,匿名內部類總結串講

java中抽象類,介面,多型,匿名內部類總結串講

首先來談抽象類.

1.抽象類定義形式:
public(常用許可權為public)abstract class A{

}
包含抽象方法的類,必須用abstract修飾,所以,包含抽象方法的類肯定是抽象類;

抽象類&抽象方法的使用:

抽象類無法直接建立物件,只能被子類繼承後,建立子類物件。
子類需要繼承抽象父類並完成最終的方法實現細節(即重寫方法,完成方法體)。而此時,方法重寫不再是加強父類方法功能,而是父類沒有具體實現,子類完成了具體實現,我們將這種方法重寫也叫做實現方法。
抽象類是擁有構造方法的,其存在的意義在於對自身進行初始化,供其子類使用。

抽象類常見疑惑

  • 抽象類一定是個父類,因為抽象類時不斷抽取共性需求而來的。
  • 抽象類中是可以不定義抽象方法的,此時僅僅是不讓該類建立物件,用於某些特殊的設計需要。
  • 設計時由具體類抽取出抽象類,而開發階段應該先定義抽象父類,再根據不同需求由父類定義子類。

介面

介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。
介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。
請記住:一切事物均有功能,即一切事物均有介面。

在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該介面的所有抽象方法,完成具體的邏輯。

介面中成員的特點

1、介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數也稱之為常量,其值不能改變。
2、介面中可以定義方法,方法也有固定的修飾符—public abstract,但可以省略。
3、介面不可以建立物件。
4、子類必須覆蓋掉介面中所有的抽象方法後,子類才可以例項化。否則子類是一個抽象類。

介面特點

  • 介面可以繼承介面
    如同類繼承類後便擁有了父類的成員,可以使用父類的非私有成員。A介面繼承B介面後,A介面便擁有了A、B兩個介面中所有的抽象方法。
  • Java支援一個類同時實現多個介面,或一個介面同時繼承多個介面。
  • 類可以在繼承一個類的同時,實現多個介面。
  • 介面與父類的功能可以重複,均代表要具備某種功能,並不衝突。

介面和抽象類對比:

相同點:

  1. 都位於繼承的頂端,用於被其他類實現或繼承;
  2. 都不能直接例項化物件;(如果抽象類的子類能夠例項化物件,那麼必然這個子類實現了父類中的所有抽象方法;)
  3. 都包含抽象方法,其子類都必須覆寫這些抽象方法;

    區別:

  4. 抽象類為部分方法提供實現,避免子類重複實現這些方法,提高程式碼重用性;介面只能包含抽象方法;
    2.一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個介面;(介面彌補了Java的單繼承)

    1. 二者的選用: 優先選用介面,儘量少用抽象類; 需要定義子類的行為,又要為子類提供共性功能時才選用抽象類;

多型程式碼體現:

Java中多型的程式碼體現在一個子類物件(實現類物件)既可以給這個子類(實現類物件)引用變數賦值,又可以給這個子類(實現類物件)的父類(介面)變數賦值。
如Student類可以為Person類的子類。那麼一個Student物件既可以賦值給一個Student型別的引用,也可以賦值給一個Person型別的引用。
最終多型體現為**父類引用變數可以指向子類物件。
多型的前提是必須有子父類關係或者類實現介面關係,否則無法完成多型。
在使用多型後的父類引用變數呼叫方法時,會呼叫子類重寫後的方法。**

內部類

內部類分為成員內部類與區域性內部類。
我們定義內部類時,就是一個正常定義類的過程,同樣包含各種修飾符、繼承與實現關係等。在內部類中可以直接訪問外部類的所有成員。

成員內部類

成員內部類,定義在外部類中的成員位置。與類中的成員變數相似,可通過外部類物件進行訪問
 定義格式

class 外部類 { 
    修飾符 class 內部類 {
        //其他程式碼
}
}

 訪問方式
外部類名.內部類名 變數名 = new 外部類名().new 內部類名();

 成員內部類程式碼演示
定義類

class Body {//外部類,身體
    private boolean life= true; //生命狀態
     public class Heart { //內部類,心臟
    public void jump() {
         System.out.println("心臟噗通噗通的跳")
            System.out.println("生命狀態" + life); //訪問外部類成員變數
}
}
}

訪問內部類

public static void main(String[] args) {
    //建立內部類物件
    Body.Heart bh = new Body().new Heart();
    //呼叫內部類中的方法
    bh.jump();
}

內部類的實際使用——匿名內部類

匿名內部類概念

最常用到的內部類就是匿名內部類,它是區域性內部類的一種。
定義的匿名內部類有兩個含義:
 臨時定義某一指定型別的子類
 定義後即刻建立剛剛定義的這個子類的物件

定義匿名內部類的作用與格式

作用:匿名內部類是建立某個型別子類物件的快捷方式。
格式:
new 父類或介面(){
//進行方法重寫
};

 程式碼演示
//已經存在的父類:
public abstract class Person{
public abstract void eat();
}
//定義並建立該父類的子類物件,並用多型的方式賦值給父類引用變數
Person p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//呼叫eat方法
p.eat();
使用匿名物件的方式,將定義子類與建立子類物件兩個步驟由一個格式一次完成,。雖然是兩個步驟,但是兩個步驟是連在一起完成的。
匿名內部類如果不定義變數引用,則也是匿名物件。程式碼如下:
new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();