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,我感覺自己有點明白了一些,多態就是用子類的調用方法,來將子類中重寫的父類方法,讓父類調用。即父類對象的框架上,將子類的覆寫方法覆蓋父類的方法,當然父類類上不存在的方法,對象沒有內存空間存放子類方法,編譯自然就有問題了。總之,多態就是與覆寫方法有關,與成員變量無關。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章