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,并打印新租金。再次感谢。