如果我在java中对同一个对象调用new两次会发生什么?

时间:2013-03-01 23:57:25

标签: java object

所以说我有一些像这样的测试java代码:

class A(){
       int a = 0;
       public A{
             a = 1;
       }
 class B(){
       A object = new A(); //Object one
       A object = new A(); //Object two

我的问题是:在A类中,当我在对象上调用new运算符两次时会发生什么?它是否会创建一个新对象A并销毁旧对象?还是会出错?它只是重置旧对象吗?

我已经尝试了几次并且不太了解输出。

3 个答案:

答案 0 :(得分:4)

这是第二个A对象。

第一个将很快收集垃圾。

请注意,您也可以

new A();
new A();

不将它们存储在变量中。它完全有效,并将被执行。

另请注意

A obj1 = new A();
A obj2 = obj1;

复制对象,但它是对同一对象的引用。显然,你也可以有0个引用。

答案 1 :(得分:1)

我不相信这会编译。

但是如果问题是当我两次调用构造函数时会发生什么,答案是你得到了两个类的实例:

class A {
    int a = 0;

    public A(int input) {
        a = input;
    }
}

class B {
    A object1 = new A(1); //Object one
    A object2 = new A(2); //Object two
    A object3 = object2;
    //object1 != object2

    public B(){
        A a = new A(3);
        a = new A(4); // a points at the last A defined

        System.out.println(object1.a); //prints 1
        System.out.println(object2.a); //prints 2
        System.out.println(object3.a); //prints 2
        System.out.println(a.a); //prints 4
    }
}

此外,如果再次调用a = new A();,前一个实例将被标记为垃圾回收,而一个实例被分配给新的A()

答案 2 :(得分:1)

我真的不明白你在这里要做什么,而且你的代码没有编译。我在下面用注释创建了一个代码的工作示例。

这会回答你的问题吗?

public class Main {
    //Test method to instantiate a new B
    public static void main(String[] args) {
       B b = new B();
    }
}

class A {
      int a = 0;
        public A() {
         a =1;
        }
}

class B {

    public B() {
        A a = new A();
        //Print first object reference
        System.out.println("First object reference assigned to a: " + a.toString());

        //You cannot instantiate the same field/variable twice.
        // However, you can change the object reference as below
        a = new A();

        //Print second object reference
        System.out.println("Second object reference assigned to a: " + a.toString());

        //As you can see, the object
        // reference points at the new Instance of A when creating a
        // new instance of A and assigning the reference to field a

    }

}

如果你运行它,你的输出将如下所示:

First object reference assigned to a: A@750159
Second object reference assigned to a: A@1abab88