[英]Method override returns null
我是Java新手。 所以問題可能聽起來很簡單,但我被卡住了,無法弄清楚為什么這段代碼返回 null 和 0.0 ?
文件: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()); } }
輸出
Name: null Price: 0.0
您已經在Car
聲明了單獨的name
和price
變量,並且從未為它們賦值 - 它們與在Transport
聲明(和初始化)的name
和price
變量不同。 所以你基本上看到了String
和double
的默認值。 去掉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()
以使其更加地道。
您正在通過 super() 將這兩個值傳遞給父類 Transport。 所以
Car c = new Car("CarBrand", 1000);
最終會設定
運輸類屬性名稱和價格。
您不需要在 Car 類中聲明這兩個屬性。 Car 將通過繼承隱式具有這兩個屬性。 在這里,您正在為 Car 創建單獨的屬性。
問題是你有兩個不同的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
派生類Car
隱藏了類Transport
的實例變量。因此,盡管您從Transport
類繼承了正確初始化的數據成員,但是初始化為其默認值的Car
類實例變量是從Car
類方法返回的
當你創建 Car 類型的 'c' 對象時,你只為 Transport 類的 'name' 和 'price' 變量賦值(因為在你的構造函數中你調用 super(name, price) ,它會從你的父類調用構造函數)。
這里: c.carName() 你從你的 Car 類調用方法(因為被標記為@Override)並且這個返回來自類 Car 的“name”變量的值。 在您的情況下,此變量為 null,因為您尚未為其分配任何值。 您為 Transport 類型的“name”變量分配了值“CarBrand”。 'price' 變量也是如此。
使用 super 將通過調用構造函數 super(name, price) 返回您已經存儲在父類中的值,使用 super 后跟點符號將訪問父類方法。 所以 super.carPrice() 將返回存儲在父類中的值。
此外,@Override 注釋應該只用於在子類中使用新功能更改父類中的現有方法,而無需更改名稱。 因此,對於 carname() 的 @Overide,您需要調用 super.carname(),因為您要從父類返回值。
簡而言之,之所以獲得 null 和 0.0 是因為您在訪問父類值時訪問了子類值。
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;
}
}
Your class should be
public class Car extends Transport{
public Car(String name, double price) {
super(name, price);
}
public String getName(){
return super.carName();
}
@Override
public double carPrice(){
return super.carPrice()* 1.5;
}
}
你的主班現在應該是
public class Main {
public static void main(String[] args) {
Car c = new Car("CarBrand", 1000);
System.out.println("Name: " + c.getName());
System.out.println("Price: " + c.carPrice());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.