複習筆記06 介面與多型
1 介面
1.1 介面的概述
介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。
介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。
1.2 介面的格式&使用
1.2.1 介面的格式
與定義類的class不同,介面定義時需要使用interface關鍵字。
定義介面所在的仍為.java檔案,雖然宣告時使用的為interface關鍵字的編譯後仍然會產生.class檔案。這點可以讓我們將介面看做是一種只包含了功能宣告的特殊類。
定義格式:
public interface 介面名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
1.2.2 介面的使用
介面中的方法全是抽象方法,直接new介面來呼叫方法沒有意義,Java也不允許這樣幹
類與介面的關係為實現關係,即類實現介面。實現的動作類似繼承,只是關鍵字不同,實現使用implements
其他類(實現類)實現介面後,就相當於宣告:”我應該具備這個介面中的功能”。實現類仍然需要重寫方法以實現具體的功能。
格式:
class 類 implements 介面 {
重寫介面中方法
}
在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。
1.3 介面中成員的特點
1、介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數也稱之為常量,其值不能改變。
2、介面中可以定義方法,方法也有固定的修飾符,public abstract
3、介面不可以建立物件。
4、子類必須覆蓋掉介面中所有的抽象方法後,子類才可以例項化。否則子類是一個抽象類。
1.4 介面和類的關係
A:類與類之間:繼承關係,一個類只能直接繼承一個父類,但是支援多重繼承
B:類與介面之間:只有實現關係,一個類可以實現多個介面
C:介面與介面之間:只有
1.5 介面優點
1.類與介面的關係,實現關係,而且是多實現,一個類可以實現多個介面,類與類之間是繼承關係,java中的繼承是單一繼承,一個類只能有一個父類,打破了繼承的侷限性。
2.對外提供規則
3.降低了程式的耦合性(可以實現模組化開發,定義好規則,每個人實現自己的模組,提高了開發的效率)
1.6 介面和抽象類的區別
1.共性:
不斷的進行抽取,抽取出抽象的,沒有具體實現的方法,都不能例項化(不能建立物件)
2.區別
1: 與類的關係
類與介面是實現關係,而且是多實現,一個類可以實現多個介面,類與抽象類是繼承關係,Java中的繼承是單一繼承,多層繼承,一個類只能繼承一個父類,但是可以有爺爺類
2: 成員
a.成員變數
抽象類可以有成員變數,也可以有常量
介面只能有常量,預設修飾符public static final
b.成員方法
抽象類可以有抽象方法,也可以有非抽象方法
介面只能有抽象方法,預設修飾符 public abstract
c.構造方法
抽象類有構造方法,為子類提供
介面沒有構造方法
2 匿名物件&final
2.1 匿名物件定義&使用
匿名物件:沒有名字的物件
匿名物件的應用場景:
當方法只調用一次的時候可以使用匿名物件
可以當作引數進行傳遞,但是無法在傳參之前做其他的事情
注意:匿名物件可以呼叫成員變數並賦值,但是賦值並沒有意義
2.2 final關鍵字
final:修飾符,可以用於修飾類、成員方法和成員變數
final所修飾的類:不能被繼承,不能有子類
final所修飾的方法:不能被重寫
final所修飾的變數:是不可以修改的,是常量
3 多型
3.1 多型的定義與使用格式
多型的定義格式:就是父類的引用變數指向子類物件
父類型別 變數名 = new 子類型別();
變數名.方法名();
A:普通類多型定義的格式
父類 變數名 = new 子類();
如: class Fu {}
class Zi extends Fu {}
//類的多型使用
Fu f = new Zi();
B:抽象類多型定義的格式
抽象類 變數名 = new 抽象類子類();
如: abstract class Fu {
public abstract void method();
}
class Zi extends Fu {
public void method(){
System.out.println(“重寫父類抽象方法”);
}
}
//類的多型使用
Fu fu= new Zi();
C:介面多型定義的格式
介面 變數名 = new 介面實現類();
如: interface Fu {
public abstract void method();
}
class Zi implements Fu {
public void method(){
System.out.println(“重寫介面抽象方法”);
}
}
//介面的多型使用
Fu fu = new Zi();
3.2 多型成員的特點
多型的成員特點:
成員變數 編譯時看的是左邊,執行時看的左邊
成員方法 編譯時看的是左邊,執行時看右邊
靜態方法 編譯時看的是左邊,執行時看的也是左邊
編譯時看的都是左邊,執行時成員方法看的是右邊,其他(成員變數和靜態的方法)看的都是左邊
3.3 多型中向上轉型與向下轉型
多型的轉型分為向上轉型與向下轉型兩種:
A:向上轉型:當有子類物件賦值給一個父類引用時,便是向上轉型,多型本身就是向上轉型的過程。
使用格式:
父類型別 變數名 = new 子類型別();
如:Person p = new Student();
B:向下轉型:一個已經向上轉型的子類物件可以使用強制型別轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接建立父類物件,是無法向下轉型的
使用格式:
子類型別 變數名 = (子類型別) 父類型別的變數;
如:Student stu = (Student) p; //變數p 實際上指向Student物件