2014-02-12 231 views
0

請解釋一下爲什麼當我編譯這段代碼的結果是0?怎麼會這樣 ?方法繼承

class Parentt { 
     int x = 0; 
     public void printX() { 
      System.out.println(x); 
    } 
    } 
    class Child1 extends Parentt { 
     int x = -1; 
    } 

    public class Foo { 
     public static void main(String[] args) { 
      new Child1().printX(); 
     } 
    } 
+1

因爲你在陰影'Parentt' –

+1

擊敗我的變量。通常編譯不會返回一個數字。但是如果你執行它,你將會從Parentt打印x的值,因爲Child1有它自己的副本(因爲你再次聲明它),這是從Parentt不可見的。 –

回答

10

你不能覆蓋字段,你只能hide他們。

您的Child1.x字段隱藏了Parent.x字段。

字段基於對他們進行訪問的引用聲明的類型解決,所以

public void printX() { 
    System.out.println(x); 
    // equivalent to System.out.println(this.x); where this's declared type is Parent 
} 

指的是Parent的領域。

0

簡短回答:因爲您的子類中的變量x沒有(也不能)覆蓋Parentt中的變量x。方法可以被覆蓋,變量不能,它們只能被隱藏(這通常是不好的做法)。

1

Sotirios Delimanolis基本上已經說了所有需要的東西。

但是,如果您要在子類上定義printX方法(或者至少覆蓋它),您將得到-1。

class Parentt { 
     int x = 0; 
     public void printX() { 
      System.out.println(x); 
     } 
    } 
    class Child1 extends Parentt { 
     int x = -1; 

     @Override 
     public void printX() { 
      System.out.println(x); 
     } 
    } 

有了這個例子中的代碼

Child1 c = new Child1(); 
c.printX(); 

將返回-1