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