2010-07-31 44 views
0

引用考虑下面的继承示例:质疑在Java中

​​3210

我的问题是在注释中。这是不同的,从某种意义上说,使用new运算符为对象b2b2=b1创建新空间只会将b1的数据复制到b2中。因此,对一个对象所做的任何更改都不会影响其他对象。在主内联代码中,B b2 = b1将指向b2到分配给b1的空间。因此,这里的任何更改都会影响对象数据。

我的查询是,会用new运算符对对象操作有什么区别?

+0

没有复制发生。 – whiskeysierra 2010-07-31 10:03:41

回答

9
B b1 = new B(); 
B b2 = b1; 

上面的代码创建B类型的只有一个对象。 b1和b2是指向同一个对象的引用。他们是别名到同一个对象。

B b1 = new B(); //1 
B b2 = new B(); //2 
b2 = b1;  //3 

在该代码中,在线路1和2。然而创建B类型的两个对象,第3行,B2引用相同的对象之后为B1又都是从而再次别名。现在由b2引用的对象现在变为符合垃圾回收的条件。

因此,在这两种情况下,b1和b2指向相同的对象,并且通过这两个引用都可以看到对该对象所做的任何更改。请记住,b1和b2不是对象本身,而只是对象的引用。 b1 = b2不会将任何值从一个对象复制到另一个对象,它只是重新指定引用。

2

这使得一个A对象和一个B对象。有两个对B对象的引用。

A a1 = new A(); 
B b1 = new B(); 
B b2 = b1; 

这使得一个A对象和两个B对象。有两个对第一个B对象的引用。第二个B对象不再有对它的引用,并且可用于垃圾收集。

A a1 = new A(); 
B b1 = new B(); 
B b2 = new B(); 
B b2 = b1; 

B b2 = b1;在此步骤中没有任何对象数据被复制。 b2和b1都将指向同一个对象。所以你用它来设置或获取数据并没有什么不同。

B b2 = new B(); 
B b2 = b1; 
b2.setValue("Foo"); 
b1.getValue(); // would return "Foo" 
2
B b1 = new B() 

创建一个新对象和参考分配给它,B1。

B b2 = b1 

创建一个新的引用并将其设置为等于b1,这是一个引用。

没有“将b1的数据复制到b2中”。现在两个参考指向相同的基础对象。