方法覆盖返回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创建单独的属性。


问题在于你有两个不同的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

链接地址: http://www.djcxy.com/p/76167.html

上一篇: Method override returns null

下一篇: set a property only if the value is not null