Method override returns null

I'm newbie in Java. So question might sound simple, but I'm stuck and can not figure out why this code returns null and 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;
    }
}

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

Output

Name: null
Price: 0.0

You've declared separate name and price variables in Car , and never assigned a value to them - they're not the same as the name and price variables declared (and initialized) in Transport . So you're seeing the default values for String and double , basically. Get rid of those extra variables in Car , and use super.carPrice() to get the original price from Transport :

public class Car extends Transport {    
    public Car(String name, double price) {
        super(name, price);
    }

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

Note that there's no need to override carName() at all unless you really want it to change behaviour.

I'd also suggest changing carName() and carPrice() to getName() and getPrice() to be more idiomatic.


You are passing both the values to parent class Transport through super(). So

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

will eventually set

Transport class attributes name & price.

You dont need to declare both the attributes in Car class. Car will have both attributes implicitly through inheritance. Here you are creating separate attributes for Car.


The problem is that you have two different variables for name , one in Car and one in Transport. c.carName() returns Car.name which has not been initialized.

If your car class is the one below, it will work

public class Car extends Transport {
    public Car(String name, double price) {
        super(name, price);
    }

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

the same goes for the variable price

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

上一篇: 在Java中适用时使用“final”修饰符

下一篇: 方法覆盖返回null