2014-09-26 130 views
2

我是新手在Java中。所以問題可能聽起來很簡單,但我卡住了,不知道爲什麼這個代碼返回null和0.0?方法重寫返回null

文件:Transport.java

public class Transport { 

     private String name; 
     private double price; 

    public Transport(String name, double price) { 
     this.name = name; 
     this.price = price; 
    } 

    public String carName() { 
     return name; 
    } 

    public double carPrice(){ 
     return price; 
    } 
}

文件:Car.java

public class Car extends Transport{ 

    protected String name; 
    protected double price; 

    public Car(String name, double price) { 
     super(name, price); 
    } 

    @Override 
    public String carName(){ 
     return name; 
    } 

    @Override 
    public double carPrice(){ 
     return price * 1.5; 
    } 
}

文件:Main.java

public class Main { 
    public static void main(String[] args) { 

     Car c = new Car("CarBrand", 1000); 

     System.out.println("Name: " + c.carName()); 
     System.out.println("Price: " + c.carPrice()); 
    } 
}

輸出

​​

回答

6

您已經聲明獨立nameprice變量Car,從來沒有賦值給他們 - 他們是不一樣的nameprice變量Transport聲明(和初始化)。所以你基本上看到Stringdouble的默認值。擺脫那些額外的變量在Car,並使用super.carPrice()Transport獲得原價:

public class Car extends Transport {  
    public Car(String name, double price) { 
     super(name, price); 
    } 

    @Override 
    public double carPrice(){ 
     return super.carPrice() * 1.5; 
    } 
} 

注意,沒有必要重寫carName()可言,除非你真的它改變行爲。

我也建議改變carName()carPrice()getName()getPrice()更習慣。

+0

好吧,明白了。但是,從Car類調用'carPrice()'方法的正確方法是什麼? – Gerardas 2014-09-26 20:39:42

+0

@Gerardas:我不確定你的意思。我已經在回答中向您展示瞭如何從'Car'調用'Transport'實現來調用原始方法,該方法只返回'price'變量......使用我的答案中的代碼替換您的類,這就是所有你需要做的。 – 2014-09-26 20:40:26

+0

何時寫評論,上面沒有代碼...謝謝你的幫助! :) – Gerardas 2014-09-26 20:44:00

0

問題是你有兩個不同的變量name,一個在Car中,另一個在Transport中。 c.carName()返回尚未初始化的Car.name

如果你的汽車類是下面的一個,它會工作

public class Car extends Transport { 
    public Car(String name, double price) { 
     super(name, price); 
    } 

    @Override 
    public double carPrice(){ 
     return price * 1.5; 
    }   
} 

也是如此變量price

+0

此更正給出錯誤:'在線程中的異常「主」java.lang.Error:未解決的編譯問題: \t字段傳輸。價格是不可見的 – Gerardas 2014-09-26 21:09:47

0

派生類Car躲在Transport類的實例變量。所以,雖然你繼承Transport類的正確初始化數據成員,但Car類初始化爲默認值的類實例變量從Car類方法返回

1

您正通過super()將這兩個值傳遞給父類Transport。所以

Car c = new Car("CarBrand", 1000); 

最終將設置

Transport class attributes name & price.

你不需要申報無論是在汽車類的屬性。汽車將通過繼承隱含兩個屬性。這裏您正在爲Car創建單獨的屬性。