类作为类内部实例变量的对象[复制](Object of the class as instance

2019-08-03 07:09发布

可能重复:
一类怎么能有它自己类型的成员,这个心不是无穷递归?

代码:

public class Test2{
    private Test2 subject = new Test2(); //Create Test2 object in Test2
    private int num;
}

这些问题:

  1. 为什么Java的允许执行上面的代码,但C ++不?

  2. 难道上面的代码中创建对象的无限数量? 由于Test2本身就蕴含着Test2对象,又含有Test2其本身所具有的对象Test2对象等。

Answer 1:

关于你的问题,这两种语言之间的主要区别是,Java是引用语义语言(与基本类型除外),和C ++与价值语义的语言,它允许引用传递通过引用和指针。

语法是类似于在这两个语言有完整的不同的含义,当在Java中创建一个参考Test2 x = new Test2(); )在C ++中会使用指针等价结构( Test2 *x = new Test2(); ) 。

一个关键的区别是,它是简单的通过使用指针值语义的顶部提供参考语义,但是它不可能对(纯)引用语义顶部提供值语义。 一些本声明包括不能够控制物体在Java的内存布局或数据的地方(比基本类型和原始类型的数组以外的任何其他)的含义,而在另一个方向上的物体的精细控制在C ++中,您可以模仿Java对象。



Answer 2:

回复问题2 - 如果你运行这段代码,你会得到一个StackOverflowException =>是它创建的对象的数量inifinite(以及它试图...)

public class Test2 {

    private Test2 subject = new Test2(); //Create Test2 object in Test2

    public static void main(String[] args) throws Exception {
        Test2 t = new Test2();
    }
}


Answer 3:

subject这里是一个实例的引用 Test2 。 如果您尝试运行它,代码将很快用完某些资源(可能堆栈空间,也许堆空间)。



Answer 4:

为什么Java的允许执行上面的代码,但C ++不?

2011年以来,C ++还允许类成员在其声明中initalised。

但是,它不会允许这种情况:你只能实例化类型齐全,而类类型的类定义中不完整的,所以它会在构造函数中被初始化,或者给一个函数的调用:

class Test;
Test * make_test();

class Test {
    // Test is incomplete, so "new Test" is not possible here
    Test * test = make_test();
};

// Test is complete, so we can instantiate it here
Test * make_test() {return new Test;}

Java没有完全类型的概念,所以类可以在任何地方实例化你被允许实例的任何类。

难道上面的代码中创造无限的对象呢?

是的,试图实例这样的类会抛出你的程序进入一个递归死亡螺旋。



Answer 5:

如果声明subjectstatic ,你会得到Singleton模式,不会让你耗尽资源的渴望初始化版本。



Answer 6:

因为你可以有多个构造其允许的。 如果你只有一个构造函数,这将确实导致一个无限循环。

public class Test{
    private Test a;

    public Test(String s){
        this.a=new Test();
    }

    public Test(){

    }

}


文章来源: Object of the class as instance variable inside the class [duplicate]