2014-09-26 77 views
2

我是新手在Java中。所以问题可能听起来很简单,但我卡住了,不知道为什么这个代码返回null和0.0?方法重写返回null

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

输出

​​

回答

6

您已经声明独立nameprice变量Car,从来没有赋值给他们 - 他们是不一样的nameprice变量Transport声明(和初始化)。所以你基本上看到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()更习惯。

+0

好吧,明白了。但是,从Car类调用'carPrice()'方法的正确方法是什么? – Gerardas 2014-09-26 20:39:42

+0

@Gerardas:我不确定你的意思。我已经在回答中向您展示了如何从'Car'调用'Transport'实现来调用原始方法,该方法只返回'price'变量......使用我的答案中的代码替换您的类,这就是所有你需要做的。 – 2014-09-26 20:40:26

+0

何时写评论,上面没有代码...谢谢你的帮助! :) – Gerardas 2014-09-26 20:44:00

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

+0

此更正给出错误:'在线程中的异常“主”java.lang.Error:未解决的编译问题: \t字段传输。价格是不可见的 – Gerardas 2014-09-26 21:09:47

0

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

1

您正通过super()将这两个值传递给父类Transport。所以

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

最终将设置

Transport class attributes name & price.

你不需要申报无论是在汽车类的属性。汽车将通过继承隐含两个属性。这里您正在为Car创建单独的属性。