Java 如何创建此类的对象?

Java 如何创建此类的对象?,java,Java,在类B中,如何创建类A的对象,而不是对象创建过程(即不创建具有null的对象) 要构造类型为A的对象,您需要向构造函数传递对另一个类型为A的对象的引用,或者传递null引用。所以你只有两个选择: A a1 = new A(null); A a2 = new A(a1); 第一次创建A类型的对象时,必须使用null引用,因为没有任何其他A类型的对象 更新 在你改变了你的问题之后,我认为不可能构造一个A类型的对象。创建一个对象的唯一方法是在构造函数中给另一个对象一个对象,但另一个对象也需要构造函

在类
B
中,如何创建类
A
的对象,而不是对象创建过程(即不创建具有
null
的对象)


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

A a1 = new A(null);
A a2 = new A(a1);
第一次创建
A
类型的对象时,必须使用null引用,因为没有任何其他
A
类型的对象


更新


在你改变了你的问题之后,我认为不可能构造一个
A

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

编辑
我的答案是基于您以前版本的代码。现在您不能创建对象,因为您不能将
null
放入构造函数中(null desn没有
one
字段)。如果你想创建一个对象,你必须在构造函数中进行空值测试,比如
If(A!=null){A.one=1;}
并在构造函数中传递空值或已经创建了一个对象。

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

为此,您必须向类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不能以书面形式实例化。

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

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


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

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

然而,严重的作弊是可能的不要在生产代码中执行此操作。但为了便于讨论:

1) 与(但不会与安全经理合作):


2) 这是。

什么背景?这是家庭作业问题吗?面试问题?
A
可编辑吗?这不是一个家庭作业问题。我对这个问题有一个想法。A肯定是不可编辑的。@Emmad谢谢你的评论,但在java中这很容易做到这是可以做到的,但不是,如果我想在构造函数中处理对象的属性,这或多或少与上面使用的方法相同。@saurabh您可以像平常一样在构造函数中使用
a.propertyName
,但您必须先检查
a
是否为
null
。如果您无法更改类别
A
的代码,则此检查应已到位。如果不是,那么我质疑该类的有用性。这将抛出NullPointerException。当您指定a1=new A(null)时,在构造函数中,A.one=1将抛出NPE。@Priyank Mark给出的解决方案与我以前版本的代码一致。在编写代码A a1=new A(null)时,Mark不知道构造函数的当前功能;默认构造函数故意不在那里。但是如果我在任何时刻传递null,那么构造函数肯定会抛出null指针异常。我认为a不能扩展。此形式的构造函数抛出NullPointerException,默认构造函数被阻止/不存在。+1:用于跳出框框思考,以及发布非常相关的链接。不确定OP是否在寻找这种解决方案,但还是非常有趣和有教育意义的!
class A
    {
        A() {
            // Constructor logic.
        }
        A(A a) {
            // Constructor logic when passing an existing object of the same type, perhaps to create a clone.
        }
    }
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);
    }
}