2012-08-22 152 views
3

我很努力去理解變量被覆蓋的方法覆蓋用Java繼承的概念。Java變量被覆蓋的方法被覆蓋的概念

情況1:

class Car{ 
    public int gearRatio = 8; 
    public String accelerate() { return "Accelerate : Car"; } 
} 
class SportsCar extends Car{ 
    public int gearRatio = 9; 
    public String accelerate() { return "Accelerate : SportsCar"; } 
    public static void main(String[] args){ 
     Car c = new SportsCar(); 
     System.out.println(c.gearRatio+" "+c.accelerate()); 
    } 
} 

輸出:8加速:跑車。

案例2:

public class TestClass{ 
    public static void main(String args[ ]){ 
     A o1 = new C(); 
     B o2 = (B) o1; 
     System.out.println(o1.m1()); 
     System.out.println(o2.i); 
    } 
} 
class A { int i = 10; int m1() { return i; } } 
class B extends A { int i = 20; int m1() { return i; } } 
class C extends B { int i = 30; int m1() { return i; } } 

輸出:30,20

所以,如果我理解正確的話,超類變量總是被調用,除非子類變量被顯式調用。但是對於調用子類重寫方法的方法,情況正好相反,除非顯式調用超類。

我會認爲變量和方法應該是相同的,否則在創建具有相同變量的子類時應該有編譯錯誤。

有人可以解釋,如果這是正確的,爲什麼java這樣工作請。

回答

11

,我覺得變量和方法應該工作相同或創建子類以相同的變量時,應該有一個編譯錯誤。

那麼,這根本不是Java的工作方式。

變量是不是多態處理 - 沒有「覆蓋」變量的概念。然而,方法多態處理。 行爲可以是專用的,但不是狀態

請注意,如果您的變量是私人的,因爲它們幾乎總是應該是這樣的,這種情況永遠都不可見。 「

+3

+1」注意,如果你的變量是私人的,因爲他們幾乎總是應該的,情況永遠不可見「 – kosa

+0

因此,爲什麼變量不是多態處理的概念並不重要,因爲它們應該始終通過處理多態的方法? – Quinma

1

在java中沒有Instance variable overriding concept和變量作爲方法沒有多態性。

所以你的情況,如果你使用:

Car c = new SportsCar(); // c is Object reference of type Car 
System.out.println(c.gearRatio+" "+c.accelerate()); 

c.gearRatio指速比在Carnot from SportsCar。在方法c.accelerate()的情況下,方法在SportsCar中被覆蓋,並且它是SportsCar對象,因此調用SportsCar.accelerate()

public static void main(String args[ ]){ 
    A o1 = new C(); // object reference is of type A and object is C 
    B o2 = (B) o1; // object of C can be type casted to B as B is parent to C 
    System.out.println(o1.m1()); // C.m1() will be called. 
    System.out.println(o2.i); // o2 is type B, so B.i will be printed 
}