2013-11-25 217 views
1
class Base 
{ 
     int x=1; 
    void show() 
    { 
     System.out.println(x); 
    } 
} 
class Child extends Base 
{ 
    int x=2; 
    public static void main(String s[]) 
    { 
     Child c=new Child(); 
     c.show(); 
    } 
} 

輸出爲1 的方法顯示在基類,但繼承優先級應給予局部變量,因此輸出應該是2或者是它的編譯器之前,它隱含的前綴超? ?爪哇 - 繼承

+1

多態性並不適用於各個領域。 –

回答

1

由於您不是覆蓋show方法中的Child,因此將使用Base的版本。因此它不能看到您在Child中定義的x變量。你的IDE(如果你使用的話)應該給你一個警告,說你「隱藏了一個領域」。

在實例化對象後,您可以通過設置對象的x來實現預期的功能。嘗試:

class Base 
{ 
    int x = 1; 

    void show() {   
     System.out.println(x); 
    } 
} 

class Child extends Base 
{ 
    public static void main(String s[]) { 

     Child c = new Child(); 

     c.show(); 
     c.x = 2; 
     c.show(); 
    }  
} 

這應產生1,然後2

編輯:請注意,當x場是從main功能來訪問這個才起作用。

2

不,這是因爲孩子沒有覆蓋show()方法。唯一可用的是Base的一個,它顯示了它的x版本。

嘗試這種方式 - 它會顯示2:

class Base 
{ 
     int x=1; 
    void show() 
    { 
     System.out.println(x); 
    } 
} 
class Child extends Base 
{ 
    int x=2; 
    public static void main(String s[]) 
    { 
     Child c=new Child(); 
     c.show(); 
    } 
    void show() 
    { 
     System.out.println(x); 
    } 
} 
0

Base類不知道Child類,所以show()方法永遠不會調用該變量從它的子類。

所以,如果你想顯示從子類中的xChild類重新實現它覆蓋show()方法。

1

有了一個顯示方法

class Child extends Base 
{ 
    public Child(int x) 
    { 
     super(x); // Assumes a constructor in the parent that accepts an int. 
     // or 
     super.x = x; 
    } 
} 

然後你只需要一個show()方法。

帶有兩個顯示方法

您覆蓋超類的功能,在它的子類,如下所示:

class Child extends Base 
{ 
    public void show() 
    { 
     // OVerrides the code in the superclass. 
     System.out.println(x); 
    } 
} 

你應該更喜歡哪個?

你試圖重寫功能,所以你應該有利於第二個選項。