2013-01-08 108 views
1

這個問題可能是一個非常基本的問題。我是Java新手,請耐心等待。 我的代碼:輸出解釋

class A 
{ 
    int b=10; 

    A() 
    { 
      this.b=7; 
    } 

    int f() 
    { 
      return b; 
    } 
} 

class B extends A{ int b; } 

class Test 
{ 
    public static void main(String[] args) 
    { 
      A a=new B(); 
      System.out.println(a.f()); 
    } 
} 

爲什麼是7的輸出? B類沒有得到自己的實例變量b

+0

似乎可變陰影。 – 2013-01-08 00:25:27

回答

6

它會但功能f只能看到在Ab版本。因此函數返回7.

如果您要將函數f複製到class B中,您將看到返回class B的成員b

由於Hiding instance variables of a class解釋,Java變量不是多態的。 2 b變量有兩個不同的變量,但是當您調用函數A.f時,它只能看到A所具有的一個b變量。所以它返回A.b而不是B.b

所以要回答你的問題,B類DOES得到它自己的實例變量b,它完全獨立於A.b,但是你目前無法訪問它,所以你看不到它的價值。

+0

您能否爲我解釋一下爲什麼或者指出我在哪裏可以閱讀更多內容?對不起Java新手。 –

+0

函數f在B類中可見嗎? –

+0

'class B extends A' thats表示無論類A具有什麼類都將可用於類B,除非'f()'是私有的或不在相同的包中。 – Smit

0

你的類型引用A

A a = new B(); 

這樣的實例字段/靜態字段和靜態方法從A提供,只要關注方法(在你的情況f())不受B重寫。

在其他語言中,作爲Scala,可以在子類中重新定義變量,甚至可以從超類型引用進行定位。