两个对象的内存参考

时间:2018-04-05 13:05:43

标签: java

我对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参考。

需要对此做出回应,我非常渴望知道我的理解是错误的。

1 个答案:

答案 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对象。