首页 文章

方法覆盖返回null

提问于
浏览
2

我是Java的新手 . 所以问题可能听起来很简单,但我陷入困境,无法弄清楚为什么这段代码返回null和0.0?

file: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;
    }
}

file: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

4 回答

  • 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 也一样

  • 1

    派生类 Car 隐藏了类 Transport .So的实例变量,尽管您从 Transport 类继承了正确初始化的数据成员,但是从 Car 类方法返回的 Car 类实例变量已初始化为其默认值

  • 7

    您通过super()将值传递给父类Transport . 所以

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

    最终会成立

    传输类属性名称和价格 .

    您不需要在Car类中声明这两个属性 . Car将通过继承隐式地拥有这两个属性 . 在这里,您将为Car创建单独的属性 .

  • 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() 更加惯用 .

相关问题