【发布时间】:2016-07-28 09:32:45
【问题描述】:
我今天发现了一件很奇怪的事情。我有以下带有静态内部类的类。
public class PDto {
private Agreement agreement = new Agreement();
public static class Agreement{
public String agreementName;
public String agreementDescription;
public String currency;
}
public Agreement getAgreement() {
return agreement;
}
public void setAgreement(Agreement agreement) {
this.agreement = agreement;
}
}
另一个类 ClassA 具有以下方法:-
private Agreement createBillingAgreement(PDto payment) {
PDto.Agreement billingAgreement = payment.getAgreement();
Agreement agreement = new Agreement();
agreement.setName(billingAgreement.agreementName);
agreement.setDescription(billingAgreement.agreementDescription);
billingAgreement.agreementName = "Changed agreeement Name" ;
}
调用A类方法的B类代码
classBService.createBillingAgreement(payment);
System.out.println("Changed billing agreement name : " + payment.getAgreement().agreementName);
当我从 ClassB 类中打印协议名称时,我得到了在 A 类的 createBillingAgreement 方法中设置的值。这怎么可能。
【问题讨论】:
-
请贴出所有相关代码。您发布的代码甚至没有通过编译。
-
您的问题对我来说并不完全清楚,但
payment.getAgreement()会在PDto中返回agreement实例(并且billingAgreement.agreementName = "Changed agreeement Name"设置该实例的名称),而Agreement agreement = new Agreement();创建一个独立实例- 但是由于缺少createBillingAgreement(...)的返回语句(可能还有其他部分),因此它的作用并不完全清楚。 -
只是一个旁注,以防止任何潜在的误解:静态内部类与其外部类没有任何特殊关系。外部类仅充当命名空间的一种形式,仅此而已。
-
你将
payment传递给createBillingAgreement,更新方法中的名称并打印出来。您希望打印出什么名称,为什么?因为根据您的描述,一切正常。 -
@viper 在 java 中当您将对象传递给方法时,您不是在使用对象的副本,而是使用对象本身。因此,如果您更新字段,该字段将在方法之外更新。除非您传递对象的不可变副本,否则情况就不同了。
标签: java static-methods inner-classes