关于java:方法覆盖返回null

Method override returns null

我是爪哇的新手。所以这个问题听起来很简单,但我被卡住了,无法理解为什么这段代码返回空值和0.0?

文件:transport.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
    }
}

文件:爪哇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
    }
}

文件:Mav.java

1
2
3
4
5
6
7
8
9
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());
    }
}

产量

1
2
Name: null
Price: 0.0


您已经在Car中声明了单独的nameprice变量,并且从未给它们赋值——它们与nameprice变量(在Transport中声明(并初始化)不同。基本上,您可以看到Stringdouble的默认值。去掉Car中的多余变量,用super.carPrice()Transport中取原价:

1
2
3
4
5
6
7
8
9
10
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()将这两个值传递给父类传输。所以

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

最终会设定

Transport class attributes name & price.

您不需要在car类中声明这两个属性。汽车将通过继承隐式地具有这两个属性。在这里,您将为汽车创建单独的属性。


创建car类型的"c"对象时,只为类传输的"name"和"price"变量分配值(因为在构造函数中,您调用将从父类调用构造函数的super(name,price)。

这里:c.car name()您从car类调用方法(因为标记为@override),而这个方法从car类返回'name'变量的值。在您的例子中,这个变量是空的,因为您还没有为它赋值。您为类型传输的"name"变量分配了值"carbrand"。"价格"变量也一样。


派生类Car隐藏了类Transport的实例变量,所以虽然您从Transport类继承了正确初始化的数据成员,但是初始化为默认值的Car类实例变量是从Car类方法返回的。


问题是,对于name,您有两个不同的变量,一个在车内,一个在运输中。c.carName()返回尚未初始化的Car.name

如果你的汽车班是下面的那一班,那就可以了

1
2
3
4
5
6
7
8
9
10
public class Car extends Transport {
    public Car(String name, double price) {
        super(name, price);
    }

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

变量price也一样。