2012-08-15 62 views
4


我只注意到覆蓋方法的行爲與覆蓋字段的行爲不同。 考慮下面的代碼片斷:覆蓋方法和字段的不同行爲

public class Bar { 
    int v =1; 

    public void printAll(){ 
    System.out.println(v); 
    printV(); 
    } 

    public void printV(){ 
    System.out.println("v is " + v); 
    } 
} 

public class Foo extends Bar { 
    int v = 4; 

    public static void main(String[] args) { 
    Foo foo = new Foo(); 
    foo.printAll(); 
} 

public void printV() { 
    System.out.println("The value v is " + v); 
} 
} 

它導致輸出:
值v爲4

因此看來,在欄的方法printV由foo.printV重寫而欄v不會被覆蓋。有沒有人知道這種差異的原因?

謝謝。

+0

有沒有這樣的事情在java中重寫字段。輸出是正確的。 – 2012-08-15 14:23:06

回答

8

我只注意到覆蓋方法的行爲不同於覆蓋字段。

沒有「重寫字段」這樣的事情。你可以shadow字段,但是你不能覆蓋它們。字段不是多態的。有關更多詳細信息,請參閱section 6.4.1 of the Java Language Specification

注意,在一般情況下,字段應該幾乎總是反正私有的,這意味着你不會意識到這一點,擺在首位。

+2

同名的+1域可以是子類中的不同類型,方法只能在子類中返回更多限制類型。 – 2012-08-15 14:23:54

0

當您致電 foo.printAll(); 它正在調用正在打印值爲1的基類的函數。 然後您正在調用printV。由於繼承的類具有相同名稱的函數,因此它將被覆蓋,並調用Foo的printV。

v的值取決於您打印哪個類的值。