【问题标题】:[a bug ]Pass by Reference in Java[一个错误]Java中的引用传递
【发布时间】:2015-12-05 16:16:51
【问题描述】:

这是主要的 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,它有两个字段:length和width(都是double),它们会得到一个房间的尺寸并计算房间的面积。

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 的新手,一百万谢谢!

【问题讨论】:

标签: java


【解决方案1】:

你的问题出在你的 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 已经为我标记了有问题的部分并告诉我它可能有问题;)

你好乌鸦

【讨论】:

    【解决方案2】:

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

    您修改后的 RoomCarpet 类:

    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中声明两个同名的局部变量是非法的 相同或封闭的范围。有趣的是,你可以有局部变量,包括正式的 方法的参数,它们与类的实例变量的名称重叠。然而, 当局部变量与实例变量同名时,局部变量隐藏 实例变量。

    【讨论】:

    • 感谢您的回答!!
    • 请务必点赞并接受答案,以便帮助其他用户找到正确答案
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2020-06-11
    • 2014-06-29
    • 2015-05-21
    相关资源
    最近更新 更多