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代碼的 30條經驗總結
※Java其實很簡單
※學java還是學「ios」?「Android」?
※Java初學者常問的問題:命令篇
TAG:java學習吧 |