文章目錄
1.抽象類別與普通類
- 抽象類別就是比普通類多定義了一個抽象方法,出除了不能直接進行對象的執行個體化操作之外並沒有任何的不同
- 一個抽象類別不可以使用final關鍵字聲明,因為final聲明的類表示不能被繼承,而抽象類別又必須輩子類重寫。
- 一個抽象類別可以定義構造方法。
- 抽象方法不要使用private聲明:在使用abstract關鍵字修飾方法時不能使用private修飾,因為抽象方法必須被子類覆寫,而如果使用了private聲明,則子類是無法覆寫的。
- 在java中允許一個抽象類別實現多個介面,而且抽象類別實現介面可以不必實現介面中定義的方法。執行個體如下:
1.1抽象類別實現介面
定義介面interface1
View Code
public interface interface1 { public int print2();}
定義抽象類別abstractclass1實現介面interface1
View Code
public abstract class abstractclass1 implements interface1 {}
2.介面
- 介面可以被理解為一種特殊的類,是由全域常量和公用的抽象方法所組成。
- 在介面中抽象方法必須定義為public存取權限,這是絕對不可改變的,即使在介面中不寫public,則也是public存取權限。
- 在很多的java程式中,經常看到寫編程介面方法時省略了public,那麼就會有很多的讀者認為它的存取權限是default,實際上這是錯誤的,不管寫與不寫,介面中的方法永遠是public的。
- 介面可以繼承(extends)介面,可以實現介面的多繼承,比如:public interface interface3 extends interface1, interface2 {}。不過有一個要求,那就是interface1和interface2兩個介面中沒有衝突的方法定義。所謂衝突的方法定義就是方法名相同,但是傳回型別或者參數不同的方法。
- 介面不可以繼承抽象類別。
- java對類只支援單繼承,但是一個類可以實現多個介面,這相當於擺脫了單繼承的局限。如果被實現的多個介面中有多個相同方法(參數和傳回型別都相同),那麼在實現介面是相當於同時實現這兩個介面的這個方法。如果被實現的介面中有同名但是不同類型的方法,那麼這些方法都必須在類中重寫實現。
2.1介面的定義View Code
public interface A { public static final String name="張三"; public abstract void print(); public abstract String getInfo();}
因為在介面的基本概念中明確聲明了介面是由全域常量和公用的抽象方法所組成,因此上述介面可以簡寫成如下形式:
View Code
public interface A { String name="張三"; void print(); String getInfo();}
3.對象的多態
在java中多態主要分為兩類
- 方法的重寫(override)和方法的重載(overload)
- 對象的多態
對象的多態又主要分為以下兩種類型
- 向上轉型:子類對象->父類對象。用子類執行個體化父類。父類 父類對象 = 子類執行個體。程式自動完成
- 向下轉型:父類對象->子類對象。用父類執行個體化子類。子類 子類對象 = (子類)父類執行個體。必須明確得指定要轉型的子類類型。這裡的 (子類) 就是強制類型轉換。 在對象向下轉型前,必須首先發生對象的向上轉型。
多態的執行個體
父類A
View Code
public class A { public void fun1() { System.out.println("A-->public void fun1(){}"); } public void fun2() { this.fun1(); }}
子類B
View Code
public class B extends A { public void fun1() { System.out.println("B-->public void fun1(){}"); } public void fun3() { System.out.println("B-->public void fun3(){}"); }}
主程式PolyDemo2
View Code
public class PolyDemo2 { public static void main(String[] args) { A a=new B();//向上轉型 a.fun1();//發生向上轉型,調用被子類B重寫過的方法 a.fun2();//fun2沒有被子類重寫,調用父類A自己的方法,但是fun2又調用自身的fun1, //而fun1被子類B重寫過,所以調用子類B中的fun1 B b=(B)a;//向下轉型 b.fun1();//調用自身的方法 b.fun2();//調用父類A的fun2,但是在父類A中fun2調用fun1, //fun1被子類B重寫,所以還是調用子類B中的fun1 b.fun3();//調用自身定義的fun3. }}
程式輸出結果:
B-->public void fun1(){}
B-->public void fun1(){}
B-->public void fun1(){}
B-->public void fun1(){}
B-->public void fun3(){}