簡體   English   中英

方法覆蓋返回 null

[英]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聲明了單獨的nameprice變量,並且從未為它們賦值 - 它們與在Transport聲明(和初始化)的nameprice變量不同。 所以你基本上看到了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()以使其更加地道。

您正在通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM