在课程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.
}
}
答案 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);
}
}
答案 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的实例。