Java对象:方法不';不要照原样打印
我有两门课:公寓和建筑。公寓类:Java对象:方法不';不要照原样打印,java,object,Java,Object,我有两门课:公寓和建筑。公寓类: public class Apartment { private String familyName; private int rent; private boolean isRented; } Building类有一个公寓数组和一个NUMOFPartments变量,该变量指示该建筑有多少公寓,还有一个最终变量,该变量指示一座建筑中公寓的最大数量 private Apartment[] apartments; private int n
public class Apartment {
private String familyName;
private int rent;
private boolean isRented;
}
Building类有一个公寓数组和一个NUMOFPartments变量,该变量指示该建筑有多少公寓,还有一个最终变量,该变量指示一座建筑中公寓的最大数量
private Apartment[] apartments;
private int numOfApartments;
private final int MAX_APARTMENTS=20;
public Building() {
this.apartments=new Apartment[MAX_APARTMENTS];
this.numOfApartments=0;
}
现在我想做一个方法,将公寓租金提高一个数量,作为参数:
public void raiseRent(int amount) {
for (int i=0; i<numOfApartments; i++) {
apartments[i].setRent(apartments[i].getRent() + amount);
}
}
主要问题是:
String familyName; int rent;
System.out.println("enter family name and rent by this order");
familyName=scan.next();
rent=scan.nextInt();
Apartment a=new Apartment(familyName,rent); //build new apartment object.
Building b=new Building();
System.out.println(b.addApartment(a));
b.raiseRent(200); //initiate the raiseRent method.
这里的一切都很有效,但当我写这篇文章时:
System.out.println(a);
System.out.println(b.apartments[0]);
租金显示为旧租金,而不是更新后的租金。
当我写这篇文章时:
System.out.println(a);
System.out.println(b.apartments[0]);
它起作用了
为什么我写System.out.println(a);它不起作用了
谢谢您的回答。问题出在您的
添加单元
方法中:您不是将传递到数组中的单元
对象添加到数组中,而是通过调用副本构造函数来添加一个全新的对象,该对象是使用新建
创建的。这会断开传入的名为a
的变量与数组索引0处的元素之间的连接,从而解释打印值的差异
您在addpartment
中拥有的复制语义实际上是一件好事:它避免了以后出现异常的别名,因为实现不再依赖调用方传递不同的对象。将代码更改为
apartments[this.numOfApartments] = a; // No copy
创建问题,因为单元
是可变的。考虑这个调用序列:
Apartment a = new Apartment();
for (int i = 100 ; i <= 1000 ; i += 100) {
a.setRent(i);
building.addApartment(a);
}
公寓a=新公寓();
对于(int i=100;i在
公共公寓(公寓a)
方法:
this.apartments[this.numOfApartments]=new Apartment(a);
创建一个新公寓,该公寓似乎是从现有公寓中构建的。这是一个副本
在你提高租金后,租金就会上涨
公寓a=新公寓(familyName,rent);//构建新公寓对象。
你传给的
b.add公寓(a)
将不会有更新的租金。这是因为Java是按值传递的。它是新公寓中的“新”int
,您的建筑公寓[]
集合包含,即使您从现有集合设置它(This.rent=other.rent
)请显示添加的@DasbLinkedLight方法的代码。为什么this.plants[this.numofartments]=新公寓(a);
而不是公寓[this.numofartments]=a;
?@HovercraftFullOfEels我怀疑这是一种家庭作业或其他学习练习来教授传递值。@HovercraftFullOfEels-它解决了这个问题!谢谢。你能解释一下为什么它会在我的代码中产生这个问题吗?新的单元
是参照现有的单元
构建的-假设租金、姓氏等都是复制出来的,你还没有解释为什么这不起作用。@Doug这仍然是一个新对象。租金是在复制公寓对象上提高的,而不是在原始公寓对象上提高的。一旦复制完成,它的生命就独立于传递到<代码>新公寓(a)中的原始对象
。准确地说。你的答案实际上并没有解释为什么它是这样工作的。intx=0;inty=x;y=1
可以让x
=0或x
=1取决于语言的语义。这个问题的存在本质上表明,发帖者试图理解Java.y中的传递值语义是如何工作的我们的答案没有解释为什么,只是说,“它没有按照你期望的方式工作,这很好”用这么多的话来说。复制语义是Java中一个基本类型固有的,所以它不是故意的,因此产生了混淆。@Doug我不知道复制是故意的还是无意的:addApartment
的代码可能来自其他人,作为学习作业的一部分。没错,但是因为海报正在执行复制操作一个对象的结构,然后期待在原件中反映的变化,这意味着对java如何处理这些事物缺乏理解。因此,如果没有解决这些概念,我认为你的答案是缺乏的。你说过什么,你说它很好发生,但是你没有说W。为什么会这样。我的新代码:this.plants[this.numofartments]=a;将对象的副本发送到我的数组,而不是原始的?不完全-它存储了a
值的副本,该值是一个引用。对象(实例)保持不变,现在在Building.apartments
集合中共享,以及从程序的任何部分调用所有这些内容(例如main
)。这意味着您从建筑或从a
对公寓所做的更改将是对同一对象实例的更改。正如@dasblinkenlight指出的,共享状态(访问对象)并不总是一件好事可以提出自己的一系列挑战。那么这是否意味着我现在已经为a对象创建了别名?如果是这样,那不是我想要实现的…有没有一种方法可以使我的目标没有别名?目标是什么?我的意思是,你可以为a
对象添加别名,并在Building
实例内外共享它或者你有不同的公寓
实例,就是这样。你明白我的意思吗?也许如果我更好地理解你的目标,我可以更清楚地回答你。首先,我想将a公寓添加到我的建筑阵列中。a对象是我作为参数接收的公寓。然后,我想提高建筑中公寓的租金包括a,并打印新租金。再次感谢。