查询Java中的引用

时间:2010-07-31 03:46:32

标签: java reference

考虑以下继承示例:

class A {...}  
class B extends A  
{  
 ..  
 ..  
 private static void main(String[] s)  
 {  
    A a1 = new A();  
    B b1 = new B();  
    B b2 = b1;             // What if it was B b2 = new B(); b2 = b1;  
 }
}

我的问题在评论中。在某种意义上,使用new运算符为对象b2创建新空间并且b2=b1只会将b1的数据复制到{{}中,它会有所不同吗? 1}}。因此,对一个对象所做的任何更改都不会影响另一个对象。在主内联代码中,b2会将B b2 = b1指向为b2分配的空间。因此,此处的任何更改都会影响对象数据。

我的查询是,是否会使用b1运算符对对象操作产生任何影响?

3 个答案:

答案 0 :(得分: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不会将任何值从一个对象复制到另一个对象,它只是重新创建引用。

答案 1 :(得分: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 :(得分:2)

B b1 = new B()

创建一个新对象并为其指定一个引用,b1。

B b2 = b1

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

没有“将b1的数据复制到b2”。现在,两个引用指向相同的底层对象。