我对java对象内存分配有疑问,我试过一个例子,但看起来我的理解不正确。需要帮助以澄清这一点。
以下示例提供更多解释,
Example
Class A { int a; B b; public B getB( return this.b); public void setB(B b){this.b=b}}
Class B {
Float amount;
String type;
B(Float amount,String type){this.amount=amount; this.type=type}
public B getType( return this.type);
public void setType(String type){this.type=type}
@override
public boolean equals(Object o){
if(this==0) return true;
if(this!=null && this.getClass()!=o.getClass()) return false;
B that = (B)o;
return this.amount== that.amount;
}
@override
public int hashCode(){
int result=0;
result=31*result+(this.amount!=null?this.amount.hashCode():0);
return result;
}
Class C{
public static void main(String s[]){
A aObj1 = new A(2,new B(10f,"a1"));
System.out.println(" Befor change :: aObj1.getB().getType() ==>"+ aObj1.getB().getType());
A aObj2 = new A(2,new B(10f,"a2"));
System.out.println(" Befor change :: aObj2.getB().getType() ==>"+ aObj2.getB().getType());
aObj2.getB().setType("a11");
System.out.println(" After change :: aObj1.getB().getType() ==>"+ aObj1.getB().getType());
System.out.println(" After change :: aObj2.getB().getType() ==>"+ aObj2.getB().getType());
}
}
}
输出我低于::
Befor change :: aObj1.getB().getType() ==> a1
Befor change :: aObj2.getB().getType() ==> a2
After change :: aObj1.getB().getType() ==> a1
After change :: aObj2.getB().getType() ==> a11
我的问题是,根据我的理解,不同A对象中的B引用都应该指向相同的内存位置,因为我有覆盖等于和hashCode。那么为什么改变对象aObj2的参考B不反映aObj1的B参考。
需要对此做出回应,我非常渴望知道我的理解是错误的。
答案 0 :(得分:0)
有两个不同的B
个对象!
A aObj1 = new A(2,new B(10f,"a1")); // <----- you created one here
System.out.println(" Befor change :: aObj1.getB().getType() ==>"+ aObj1.getB().getType());
A aObj2 = new A(2,new B(10f,"a2")); // and another one here
基本上,每次使用new
关键字时,都会创建一个新对象。
因此,更改B
引用的aObj2
对象不会影响B
引用的aObj1
对象。