Java多態的內存機制
學習java也快一年多了,看過很多方面的書,也喜歡在網絡上學習優秀的java資料。但是每當自己打開myeclipse時,總是那么的不自信…………,java基礎部分的內容自己以及掌握,并能很好運用,加油吧,多實踐,多總結,一定會有所突破的。老銀每天進步一點點。
今天就總結一下,自己看過的資料上好的列子。
1:java面向對象特征:抽象,封裝,繼承,多態。
抽象:
封裝:
繼承:
多態:
寫一個類,來完成以上所包含的抽象,封裝,繼承內容
class LaoYin extends Thread implements Runnable{ private int Number=1111111; private String name ="loayin"; @Override public void run() { System.out.println("java學習者"); } } java中通過重載,和重寫機制來實現多態。 /** * * @author YXP 小技巧:當我們想讓類中的私有變量讓外界訪問到:使用SET();GET(). * 簡單方法是選中這些變量,右鍵,source 然后Ganerate Gater and Seter,即可。 * */ public class DuoTai { String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void cry(){ System.out.println("不知道怎么叫"); } public static void main (String[] args){ DuoTai an=new Cat(); an.cry(); DuoTai ni=new Dog(); ni.cry(); } } class Cat extends DuoTai{ public void cry(){ System.out.println("喵喵 "); } } class Dog extends DuoTai{ public void cry(){ System.out.println("汪汪叫"); } } |
答案肯定是我們要的答案,父類調用子類的方法來為自己聲明對象。
但是如果我們改變一下,關于類的成員變量,這里有很大的樂趣………………
為每一個類聲明一個一樣的成員變量 count
基類100,cat是5,dog是50;
通過多態給基類聲明對象,然后通過對象進行調用變量。我們瞧瞧看。
/** * * @author YXP 小技巧:當我們想讓類中的私有變量讓外界訪問到:使用SET();GET(). * 簡單方法是選中這些變量,右鍵,source 然后Ganerate Gater and Seter,即可。 * */ public class DuoTai { String name; int age; int count=100; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void cry(){ System.out.println("不知道怎么叫"); } public static void main (String[] args){ DuoTai an=new Cat(); an.cry(); System.out.println(an.count); DuoTai ni=new Dog(); System.out.println(ni.count); ni.cry(); } } class Cat extends DuoTai{ int count=5; public void cry(){ System.out.println("喵喵 "); } } class Dog extends DuoTai{ int count=50; public void cry(){ System.out.println("汪汪叫"); } } |
運行看看:F11
喵喵
100
100
汪汪叫
現在我們就可以很好的明白多態的機制了,但是我有點暈了,對于這個用多態實現的對象,它內存中是如何實現的呢
當然main棧區呢 有na ni
但堆內存中是什么樣的內???
ni(棧內存)
int count(自身的成員變量) 上下
cry()子類覆寫的cry (如何現實的不造,原理) 糾結的感覺
只能是父類引用子類的構造函數,反過來不行。
多態引用變量會調用子類的方法,但是堆內存上依然存儲的是自己的成員變量,只是方法指向了子類的方法嗎??。
如果是指向子類的方法,那么子類必須要實現實例化,所以不成立
如果子類中有父類不曾有的方法,看看ni還能不能調用,即可知道。
答案不用說啦,編譯不能通過。
ok,我感覺自己有點明白了一些,多態就是用子類的調用方法,來將子類中重寫的父類方法,讓父類調用。即父類對象的框架上,將子類的覆寫方法覆蓋父類的方法,當然父類類上不存在的方法,對象沒有內存空間存放子類方法,編譯自然就有問題了。總之,多態就是與覆寫方法有關,與成員變量無關。