如何创建此类的对象?

时间:2012-06-02 10:19:35

标签: java

在课程B中,如何创建除了对象创建过程之外的类A的对象(即不创建具有null的对象)?

class A
  {
    public int one;  
   A(A a)
    {
      a.one=1;
    }
  }
class B
  {
   public static void main(String...args)
     {
     //now how to create an object of class A over here.
     }
  }

6 个答案:

答案 0 :(得分:7)

要构造A类型的对象,您需要向构造函数传递对A类型的另一个对象的引用,或者为null引用。所以你只有两个选择:

A a1 = new A(null);
A a2 = new A(a1);

第一次创建类型为A的对象时,必须使用空引用,因为您没有A类型的任何其他对象。


<强>更新

在您更改问题后,我认为不可能构建A类型的对象。

答案 1 :(得分:5)

如果我理解你的问题,你想创建一个对象,而不必传递一个相同类型的预先存在的对象。

为此,您必须向A类添加一个不带A类参数或修改现有参数的构造函数:

class A
    {
        A() {
            // Constructor logic.
        }
        A(A a) {
            // Constructor logic when passing an existing object of the same type, perhaps to create a clone.
        }
    }

如果由于某种原因你无法修改A类,你必须遵循Mark Byers的回答并将空引用传递给构造函数。


<强>更新

随着代码更新,此问题(或思想实验)无法解决:A类无法实例化为写入。

答案 2 :(得分:4)

您通常无法在Java中执行此操作。

但是,这可能会造成大量作弊。 请勿在生产代码中执行此操作。但是为了争论:

1)使用Mockito(但不能与安全管理员合作):

import org.mockito.Mockito;

class B {

    public static void main(String... args) {
        A mockedA = Mockito.mock(A.class);
        A realA = new A(mockedA);
        System.out.println(realA);
    }
}

2)这是another way to do it overriding finalize()

答案 3 :(得分:3)

创建A对象的唯一方法是在构造函数中给出其他A对象,但是其他A对象在构造函数中也需要另一个A对象。只有在构造函数中放入null引用时才会停止。

修改

我的回答是基于您之前的代码版本。现在你无法创建对象,因为你不能把null放在构造函数中(null des have have one field)。如果要创建A对象,则必须在if (a!=null){ a.one=1;}等构造函数中对null进行测试,并在构造函数中传递null或已创建的对象。

答案 4 :(得分:2)

如果A是密封的(不可编辑),你只能扩展该类并给一个默认构造函数将其传递给A的新实例。没有其他解决方案而没有修改A的源代码。

答案 5 :(得分:2)

您无法在示例中实例化A.这是鸡和蛋的问题。您需要A的实例来创建A的实例,但如果没有A的实例,则无法创建A的实例。

因此,如果不更改A(无论是添加'null'检查还是添加默认构造函数),您都无法在此方案中创建A的实例。