2017-03-04 164 views
0

我有一個基類和驅動類(繼承基類)。而我的基礎課也是駕駛課的對象。所以當我調用覆蓋函數時,它會給我正確的結果,通過調用驅動類函數,因爲基類具有驅動類對象。 但是,當我只是從基類對象中打印變量存在於基類和驅動器類(具有相同名稱)時,它會打印基類中存在的變量的值。有沒有辦法可以打印驅動器類變量。Java對象切片混淆

class A 
{ 
    int i = 10; 

    public void func(){ 
     System.out.print("print i : " +i); 
    } 
} 

class B extends A 
{ 
    int i = 20; 
    public void func(){ 
     System.out.print("print i : " +i); 
    } 
} 

class MainClass 
{ 
    public static void main(String[] args) 
    { 
     A a = new B(); 

     System.out.println(a.i); 
     a.func(); 
    } 
} 

輸出是: -

10 
print i : 20 

回答

1
a.i 

你正在引用基類。基類有「i」和你引用它,得到10

a.func() 

第二輸出提供了20,因爲功能得到最接近的範圍我隱藏了基類我。

0

每個類都有它的i自己的實例。如果您想BA繼承i,則需要從B中刪除int i = 20。如果要在構造新的B時初始化i,請在構造函數中執行此操作。

public B(int i) { 
    this.i = i; 
} 

但是,如果你不想這樣做,並希望從父類訪問i,你可以這樣super.i參考。

class B extends A 
{ 
    int i = 20; 
    public void func(){ 
     System.out.print("print i : " + super.i); 
    } 
} 
+0

您好@ jeremy-heiler您能否幫我理解一點點..當基類指針能夠調用驅動器類函數時,爲什麼它不能調用變量? –

+0

我不明白你的問題。 – Jeremy

+0

當基類能夠調用驅動類功能時,爲什麼不能打印同名驅動類變量? –

0

您可以實現一個方法(「吸氣劑」),並覆蓋它的好,還是那麼您可以使用關鍵字‘超級’訪問父類的變量:

System.out.println(super.i); 
+0

您好@Boschi我正在尋找訪問驅動器類變量與基類指針持有驅動器類對象。 –

+0

因爲變量名稱是相同的,所以從「MainClass」中,除非以某種方式公開它(「getter」是推薦的OO方法),否則將無法訪問此變量。 – Boschi