[一个bug]用Java传递参考

时间:2015-12-05 16:16:52

标签: java

这是主要的java类,非常简单,只需询问用户房间的宽度和长度以及每平方米的价格。然后它应该显示房间的面积和总成本。

package exercise;

import javax.swing.JOptionPane;

public class carpetshopping {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String input;
    double width;
    double length;
    double price;

    input = JOptionPane.showInputDialog("Please enter the width of the room");
    width = Double.parseDouble(input);

    input = JOptionPane.showInputDialog("Please enter the length of the room");
    length = Double.parseDouble(input);

    input = JOptionPane.showInputDialog("What about the price per unit area?");
    price = Double.parseDouble(input);

    RoomDimension dim = new RoomDimension(length, width);

    System.out.println(dim);

    RoomCarpet car = new RoomCarpet(dim, price);

    System.out.println(car);
}

}

这是RoomDimension.java,它有两个字段:长度和宽度(都是双),它们将获得房间的尺寸并计算房间面积。

package exercise;

public class RoomDimension {

public double length;
public double width;

public RoomDimension(double len, double w) {
    // TODO Auto-generated constructor stub
    length = len;
    width = w;
}

public RoomDimension(RoomDimension size) {
    // TODO Auto-generated constructor stub
    length = size.length;
    width = size.width;

}

public double getArea() {

    return length * width;
}

public String toString() {

    return "The area of this room is " + this.getArea();
}

}

这是RoomCarpet.java,它有两个字段,一个是价格,另一个是RoomDimension.java的对象,它将计算房间的总成本。

package exercise;

public class RoomCarpet {

public RoomDimension room;
public double carpetCost;

public RoomCarpet(RoomDimension room1, double carpetCost) {
    // TODO Auto-generated constructor stub
    room = new RoomDimension(room1);
    carpetCost = carpetCost;
}

public double getTotalCost() {

    return room.getArea() * carpetCost;
}

public String toString() {

    return "The total cost is " + this.getTotalCost();
}

}

我的问题是:无论用户输入什么价格,总费用总是0.0 有人帮帮我吗?新宝贝到Java,万分感谢!

2 个答案:

答案 0 :(得分:2)

您的问题出在您的RoomCarpet类中,在构造函数中是特定的。
你在那里写

public RoomCarpet(RoomDimension room1, double carpetCost) {
    // TODO Auto-generated constructor stub
    room = new RoomDimension(room1);
    carpetCost = carpetCost;
}

这里的问题是编译器使用参数变量" carpetCost"两次都是这样,你基本上将变量分配给自己,甚至不要触摸你想要改变的实例变量。
要克服此问题,请使用" this":

引用实例变量
public RoomCarpet(RoomDimension room1, double carpetCost) {
    // TODO Auto-generated constructor stub
    room = new RoomDimension(room1);
    this.carpetCost = carpetCost;
}

为避免将来出现这种情况,只需习惯通过" this来引用实例变量。"因为编译器知道你正在谈论哪个变量。

顺便说一句......如果您已经不使用eclipse(由于您的问题而我假设),我强烈推荐给您。在我的代码中找到问题花了大约一秒钟,因为eclipse已经为我标记了有问题的部分,并告诉我它可能存在问题;)

Greetings Raven

答案 1 :(得分:2)

问题出在您的RoomCarpet课程中。在构造函数中,您使用相同的变量carpetCost = carpetCost来混淆JVM,这会导致实例变量隐藏。编译器感到困惑,无法将正确的值分配给carpetCost变量。

Your Modified RoomCarpet Class:

class RoomCarpet {

public RoomDimension room;
public double carpetCost;

public RoomCarpet(RoomDimension room1, double carpetCost) {
    room = new RoomDimension(room1);
    this.carpetCost = carpetCost;
}

public double getTotalCost() {
    return room.getArea() * carpetCost;
}

public String toString() {
    return "The total cost is " + this.getTotalCost();
}
}
  

在Java中声明两个具有相同名称的局部变量是非法的   相同或封闭的范围。有趣的是,你可以有局部变量,包括正式变量   方法的参数,与类的实例变量的名称重叠。然而,   当局部变量与实例变量同名时,局部变量会隐藏   实例变量。