2013-11-27 138 views
0

您好,我有一個Java中繼承的具體問題。 下面是我的代碼內存如何分配以及存儲在哪裏? :Java繼承

class Parent{ 
    int x = 5; 
    public void method(){ 
     System.out.println("Parent"+ x); 
    } 
} 
public class Child extends Parent{ 
    int x = 4; 
    public void method(){ 
     System.out.println("Child"+ x); 
    } 
    public static void main(String[] args){ 
      Parent p = new Child(); 
      System.out.println(((Child) p).x); 
      System.out.println(p.x); 
     } 
} 

現在我的問題是,運行此程序,而實際發生的幕後。

  • 什麼被繼承?
  • 哪裏在內存位置?
  • 爲什麼第一syso給人4和第二給出5?(這個我能 理解在一定程度上,但澄清上述兩個將幫助 更清楚地瞭解它)

請指導

+1

查看http://stackoverflow.com/questions/6606481/virtual-table-dispatch-table – Yaneeve

回答

0

它全部關於Java inheritanceoverriding。父類中的method()將被孩子的方法覆蓋。

System.out.println(((Child) p).x);// here you are invoking child 

然後你會得到孩子的屬性。

下一個是關於Java多態性。

((Child) p).x // invoking object type, x=4 (object is child) 

    p.x // invoking reference type, x=5 (reference is parent) 

請參閱本linksthis之一。

+0

它不是關於方法,請檢查問題第一 –

1

在Java中有沒有變量覆蓋和只有方法覆蓋

System.out.println(((Child) p).x); 

這條線講點pChild和獲取x變量。

線,System.out.println(p.x);告訴打印Parentx

+0

是的,我明白,但它如何被引用?我的意思是它可能會存儲在內存中的某個地方? –

+0

@VJD你能更清楚嗎?所有對象的商店只在堆中。沒有得到你的問題。 –

1

得到什麼遺傳嗎?

所有公共和受保護的方法都在子類中繼承。字段永遠不會被繼承。

哪裏在內存位置?

我寫了一個blog post關於Java中的對象創建過程。我想你會更好地理解它。

爲什麼第一個系統給出4,第二個給出5?

字段訪問總是基於聲明的引用類型而不是實際的對象類型來解析。因此,p.x將訪問Parent的字段,因爲p的聲明類型爲Parent。而((Child)p).x將訪問Child的字段,因爲您已將類型參考文獻p更改爲Child,現在所考慮的聲明類型爲Child

+0

由於字段不是多態,所以'px'打印'5'和'((Child)p).x'的原因是打印'4',因此這些打印是根據引用類型 –

+0

@Rohit Jain,我瀏覽了你的博客,這很好。 現在仍然只有1個疑問,你能幫我解釋一下在記憶中如何以及在什麼地方將父母和孩子相關的東西存儲起來? –

相關問題