當前位置:
首頁 > 知識 > Java學習之—多態

Java學習之—多態

一、父類引用指向子類對象:

父類引用指向子類對象時,注意以下幾點:

1、實例化一個沒有名字的子類對象,然後向上轉型為父類的父類的引用,先去調用子類重寫的方法,子類沒有重寫就再去調用父類的方法。

2、只能調用父類中定義過的方法和變數(父類中沒有定義過調用的時候要報錯)

3、專屬於子類的成員變數,在子類方法中被訪問時,這時候通過父類引用還是可以調用子類重寫的的方法

4、覆蓋private方法雖然編譯器不會報錯但是也不會按照我們所期望的執行

5、覆蓋變數後,調用的成員變數與我們所期望的不一樣

6、靜態方法的行為不具有多態性,因為靜態方法是與類,而非是對單個對象相關聯的。

class Son extends Super{

int fo=2;//不是應該引用我嗎?

String s="子類專屬的變數用在子類重寫的方法中,利用父類引用可以調用該方法";

public void f(int i){

}

void f(){

}

static void g(){

}

}

public class Super {

int fo=1;//覆蓋變數後,調用的成員變數與我們所期望的不一樣,調用的是父類的成員變數

private void f(){

}

void f(int i){

}

static void g(){

}

public static void main(String[] args) {

Super s1=new Son();

s1.f(1);

s1.f();//private方法對導出類是屏蔽的,所以覆蓋private方法雖然編譯器不會報錯

//但是也不會按照我們所期望的執行

s1.g();//調用的是父類的靜態方法

}

}

運行結果:

子類專屬的變數用在子類重寫的方法中,利用父類引用可以調用該方法

父類方法訪問許可權為private時,調用父類方法

覆蓋變數結果,fo=1

父類靜態方法

二、多態:

多態存在的條件:

一、要有繼承;

二、要有重寫;注意不是重載

三、父類引用指向子類對象。實例化一個沒有名字的子類對象,然後向上轉型為父類的父類的引用

只能調用父類中定義過的方法和變數(父類中沒有定義過調用的時候要報錯)

class A {

public String show(D obj){

return("A and D");

}

public String show(A obj){

return("A and A");

}

}

class B extends A{

public String show(B obj){

return("B and B");

}

public String show(A obj){

return("B and A");

}

}

class C extends B{

}

class D extends B{

}

public class T1 {

public static void main(String[] args) {

A a2 = new B();

B b = new B();

C c = new C();

D d = new D();

/*方法調用的優先順序

1、this.show(O)

2、super.show(O)

3、this.show((super)O)、

4、super.show((super)O) */

/*

1、this.show(b)=a2.show(b)在A類里找show(b)方法,A類里沒有show(b)方法

2、super.show(b)=?A類沒有super類

3、this.show((super)b)=a2.show(a),在A類中有show(a)方法

4、a2引用指向的是B對象,且B類中有對A類中的show(a)方法重載,所以最終調用的是B類中的

show(a)方法

第4步中

父類引用指向子類對象,先去調用子類重寫的方法,子類沒有重寫就再去調用父類的方法。

*/

/*

1、this.show(c)=a2.show(c)在A類里找show(c)方法,A類里沒有show(c)方法

2、super.show(c)=?A類沒有super類

3、this.show((super)c)=a2.show(b),在A類中有show(a)方法

接下來同上一輸出

4、this.show(b)=a2.show(b)在A類里找show(b)方法,A類里沒有show(b)方法

5、super.show(b)=?A類沒有super類

6、this.show((super)b)=a2.show(a),在A類中有show(a)方法

7、a2引用指向的是B對象,且B類中有對A類中的show(a)方法重載,所以最終調用的是B類中的

show(a)方法

*/

/*

this.show(d)=a2.show(d)在A類里找show(d)方法,A類中有show(d)方法

因為B類中沒有重載A類的show(d)方法,所以最終執行的是A類中的show(d)方法

*/

/*

1、this.show(d)=b.show(d),在B類中找show(d)方法,找不到。

2、super.show(d)=a.show(d),在A類中找show(d)方法,找到後調用A類的show(d)

*/

}

}

運行結果:

B and A

B and A

A and D

B and B

B and B

A and D


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

Java多態對象的 類型轉換
寫好Java代碼的 30條經驗總結
Java其實很簡單
學java還是學「ios」?「Android」?
Java初學者常問的問題:命令篇

TAG:java學習吧 |