2009-12-22 20 views
2
class BaseClass { 
    protected int filed = 1; 
    public void method() { 
     System.out.println("+ BaseClass method"); 
    } 
} 

class DerivedClass extends BaseClass { 
    private int filed = 2; 
    public void method() { 
     System.out.println("+ DerivedClass method"); 
    } 

    public void accessFiled() { 
     System.out.println("DerivedClass: default filed = " + filed); // output 1 
     System.out.println("DerivedClass: upcasting filed = " + ((BaseClass)this).filed); // output 2 
    } 

    public void accessMethod() { 
     System.out.println("DerivedClass: default method"); 
     method(); // output "+ DerivedClass method" 
     System.out.println("DerivedClass: upcasting method"); 
     ((BaseClass)this).method(); // expecting "+ BaseClass method" but "+ DerivedClass method" 
    } 
} 

爲什麼對字段(數據成員)和方法的訪問不同?您可以在語言設計和實現細節方面向我解釋嗎?爲什麼訪問字段和方法在Java中的繼承類中有所不同?

謝謝。

+1

Duplicate http://stackoverflow.com/questions/404804/java-covariants/404817 – starblue 2009-12-22 17:06:55

+0

主要是爲了支持多態性。 – Jichao 2009-12-24 04:01:35

回答

3

發生這種情況是因爲您只能使用override方法,而不是字段。在DerivedClass中隱藏變量filed,在BaseClass中聲明。 DerivedClass的實例確實有2個字段filed,您可以通過適當的轉換訪問這兩個字段。能夠重寫字段沒有什麼意義......只有行爲。