2011-08-07 49 views
1

我正在測試協變返回類型並遇到此問題。擴展變量和協變返回類型

class Vehicle { 

    int i = 3; 
} 
class Car extends Vehicle{ 

    int i = 5; 

    public Car returningCar(){ 
     System.out.println("Returning Car"); 
     return new Car(); 
    } 

    public Vehicle returningCarInVehicle(){ 
     System.out.println("Returning CarInVehicle"); 
     return new Car(); 
    } 
} 

public class ScjpTest{ 

    public static void main(String[] args){ 

     Car car = new Car(); 
     Vehicle vehicleCar = car.returningCar(); 
     Vehicle vehicleCar2 = car.returningCarInVehicle(); 

     System.out.println("vehicleCar " + vehicleCar.i); 
     System.out.println("vehicleCar2 " + vehicleCar2.i); 

    } 
} 

輸出到上述被返回租車

Returning 
    CarInVehicle 
    vehicleCar 3 
    vehicleCar2 3 

我不明白爲什麼輸出3.我期待的輸出爲5在這兩種情況,因爲在運行時,JVM使用的實際對象不是參考。

謝謝

+0

它與協變返回類型有什麼關係? –

+0

我只是發現了一些關於Java的東西。在其他編程語言中「int i = 5;」將被標記爲「重複」標識符。 – umlcat

回答

4

字段不是虛擬/可覆蓋/等。它們將根據參考的編譯時類型來解決,在本例中爲Vehicle。由於鑄造使得編譯時類型Car的表達

System.out.println("vehicleCar2 " + ((Car)vehicleCar2).i); 

這將打印 「vehicleCar2 5」。

+0

所以字段永遠不會被覆蓋呢? – ziggy

+0

@ziggy對。它們可以有效地隱藏起來,但從未被覆蓋。 – dlev

+0

好的非常感謝。 – ziggy

2

您需要使用方法來獲得多態行爲你後(這也使它們的私人和提供公共setter和getter方法來encapsulate成員變量最佳實踐)

class Vehicle { 

     private int i = 3; 

     protected Vehicle(int i) { 
      this.i = i; 
     } 

     public int i() { 
      return i; 
     } 
    } 
    class Car extends Vehicle{ 

     public Car() { 
      super (5); 
     } 

     public Car returningCar(){ 
      System.out.println("Returning Car"); 
      return new Car(); 
     } 

     public Vehicle returningCarInVehicle(){ 
      System.out.println("Returning CarInVehicle"); 
      return new Car(); 
     } 
    } 

    public static void main(String[] args){ 

     Car car = new Car(); 
     Vehicle vehicleCar = car.returningCar(); 
     Vehicle vehicleCar2 = car.returningCarInVehicle(); 

     System.out.println("vehicleCar " + vehicleCar.i()); 
     System.out.println("vehicleCar2 " + vehicleCar2.i()); 

    } 
2

你的問題正確但多態僅適用於函數。它不適用於變量。它將在執行變量時使用引用類型,而不是引用指向的確切對象類型。您將獲得它。

+0

是的,我現在明白了。謝謝 :) – ziggy