父類應用指向子類物件指的是:
父類animal,
子類cat
,dog
。當中animal
能夠是介面或類,
cat和
dog是繼承或實現
animal
的子類。
animal
animal= new cat();
宣告的為父類,實際指向的是子類物件。我們先從記憶體角度理解。
如果aninal
父類,它裡面的變數須要占用
1m,它的子類
dog和
cat,須要占用
0.5m
記憶體。animal
animal=new
animal
();//
系統將分配記憶體
1mcatcat = new cat();
系統將分布
1.5m
記憶體!由於子類有乙個隱藏引用
super
會指向父類例項。所以例項化子類前會先例項化乙個父類。先執行父類建構函式。由於包括了父類的例項,所以
s能夠呼叫父類的方法。
cat cat1= cat
,指向那
1.5m
記憶體.animal
animalone=
(animal
)cat;//
這時候animalone
會指向1.5m
記憶體中1m
記憶體,animalone
僅僅是指向
cat中例項的父類例項物件。所以
animalone
職能呼叫父類的方法,不能呼叫子類的方法(儲存在
0.5m
記憶體中)
. cat cat2=
(cat
)animal//
執行時會報
classcatexception
。由於animal
中僅僅有
1m記憶體,而子類的引用都必需要有
1.5m
記憶體,所以無法轉換。
catcat3=
(cat
)animalone
;//這句能夠通過執行
,這時s3指向那1.5m的記憶體.因為f1是由s轉換過來的,所以它是有1.5m的記憶體的,僅僅是它指向的僅僅有1m記憶體
以上是從記憶體的角度進行分析的。
封裝:隱藏了類的內部實現機制,能夠在不影響使用者的前提下改動類的內部結構,同一時候保護了資料;
繼承:是為了重用父類**,子類繼承父類就擁有了父類的成員。
方法的重寫、過載與動態連線構成多型性。
理解多型,首先要知道「向上轉型」(子類轉為父類)。
定義了乙個子類
cat,它繼承了
animal
類,那麼後者就是前者是父類。能夠通過
catc = new cat(); 例項化乙個
cat的物件,這個不難理解。
但當我這樣定義時:
animal a = new cat(); 這代表什麼意思呢?
它表示我定義了乙個
animal
型別的引用,指向新建的
cat型別的物件。因為
cat是繼承自它的父類
animal
,所以animal
型別的引用是能夠指向
cat型別的物件的。這就是「向上轉型」。
那麼這樣做有什麼意義呢?
由於子類是對父類的乙個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,
定義乙個父類型別的引用指向乙個子類的物件既能夠使用子類強大的功能,又能夠抽取父類的共性。
所以,父類型別的引用能夠呼叫父類中定義的全部屬性和方法,而對於子類中定義而父類中沒有的方法,父類引用是無法呼叫的;
當父類方法子類未重寫,呼叫父類;若子類重寫父類方法,呼叫子類方法,
這就是動態連線。
class father
public void fun2()
}class child extends father
public void func2()
}public class test
}
class child extends father
//func2()重寫了父類father中的func2()方法
//假設父類型別的引用中呼叫了func2()方法,那麼必定是子類中重寫的這種方法
public void func2()
}
public class polymorphismtest
}
上面的程式是個非常典型的多型的樣例。子類
child繼承了父類father,並過載了父類的func1()方法,重寫了父類的func2()方法。過載後的func1(inti)和func1()不再是同乙個方法,因為父類中沒有func1(int i),那麼,父類型別的引用child就不能呼叫func1(inti)方法。而子類重寫了func2()方法,那麼父類型別的引用child在呼叫該方法時將會呼叫子類中重寫的func2()。
那麼該程式將會列印出什麼樣的結果呢?
非常顯然,應該是「
ccc」。
通過以上兩種方式我們認識了父類引用指向子類,事實上是多型的
應用,體如今下面幾點
深入了解父類引用指向子類
父類應用指向子類物件指的是 父類animal,子類cat dog 其中animal 可以是介面或類,cat和 dog是繼承或實現 animal 的子類。animal animal new cat 宣告的為父類,實際指向的是子類物件。我們先從記憶體角度理解。假設aninal 父類,它裡面的變數需要占用...
父類引用指向子類物件
要理解多型性,首先要知道什麼是 向上轉型 我定義了乙個子類cat,它繼承了animal類,那麼後者就是前者是父類。我可以通過 cat c new cat 例項化乙個cat的物件,這個不難理解。但當我這樣定義時 animal a new cat 這代表什麼意思呢?很簡單,它表示我定義了乙個animal...
父類引用指向子類物件
是多型的一種實現方式 這樣做使程式靈活性更好,若有多個子類,只需改變引用就能實現不同的功能,而不需要改變程式 父類 a 子類 a1,a2 a obj1 new a1 a obj2 new a2 如果a有乙個方法是show 子類實現了show 那麼obj1.show 就是第乙個子類的show obj2...