摘抄自:https://blog.csdn.net/han_yankun2009/article/details/40451981
Animal 父類,可以是接口或者類
Cat 子類毛雇,繼承或?qū)崿F(xiàn)Animal的子類。
從內(nèi)存角度看罕伯,假設(shè)Aninal父類,它里面的變量需要占用1M叽讳,它的子類Cat追他,需要占用0.5M內(nèi)存。
Animal animal=new Animal();? ?//系統(tǒng)將分配內(nèi)存1M
Cat cat=new Cat();? //系統(tǒng)將分配1.5M內(nèi)存岛蚤!因為子類有一個隱藏引用super會指向父類實例邑狸。所以實例化子類前會先實例化一個父類。先執(zhí)行父類構(gòu)造函數(shù)涤妒。由于包含了父類的實例单雾,所以cat可以調(diào)用父類的方法。
Animal?animal1= (Animal) cat;//這時候animal1會指向1.5M內(nèi)存中1M內(nèi)存,animal1只是指向cat中實例的父類實例對象硅堆。所以animal1只能調(diào)用父類的方法屿储,不能調(diào)用子類的方法(存儲在0.5M內(nèi)存中).?
Cat cat1=(Cat)animal //運行時會報ClassCatException。因為animal中只有1M內(nèi)存渐逃,而子類的引用都必須要有1.5M內(nèi)存够掠,所以無法轉(zhuǎn)換。
Cat?cat2=(Cat) animal1;//這句可以通過運行,這時cat2指向那1.5M的內(nèi)存.由于animal1是由cat轉(zhuǎn)換過來的,所以它是有1.5M的內(nèi)存的,只是它指向的只有1M內(nèi)存
Animal a = new Cat(); 這代表什么意思呢茄菊?它表示我定義了一個Animal類型的引用疯潭,指向新建的Cat類型的對象。由于Cat是繼承自它的父類Animal面殖,所以Animal類型的引用是可以指向Cat類型的對象的竖哩。這就是“向上轉(zhuǎn)型”。
子類Child繼承了父類Father脊僚,并重載了父類的func1()方法相叁,重寫了父類的func2()方法。重載后的func1(inti)和func1()不再是同一個方法吃挑,由于父類中沒有func1(int i)钝荡,那么,父類類型的引用child就不能調(diào)用func1(inti)方法舶衬。而子類重寫了func2()方法,那么父類類型的引用child在調(diào)用該方法時將會調(diào)用子類中重寫的func2()赎离。
child.func1();//打印結(jié)果將會是什么逛犹?????
child.func1(68);//由于在父類中沒有定義這個方法,所以它不能被父類類型的引用調(diào)用, 所以在child.func1(68)會跑出異常的