可能重复:
一类怎么能有它自己类型的成员,这个心不是无穷递归?
代码:
public class Test2{
private Test2 subject = new Test2(); //Create Test2 object in Test2
private int num;
}
这些问题:
为什么Java的允许执行上面的代码,但C ++不?
难道上面的代码中创建对象的无限数量? 由于Test2
本身就蕴含着Test2
对象,又含有Test2
其本身所具有的对象Test2
对象等。
关于你的问题,这两种语言之间的主要区别是,Java是引用语义语言(与基本类型除外),和C ++与价值语义的语言,它允许引用传递通过引用和指针。
语法是类似于在这两个语言有完整的不同的含义,当在Java中创建一个参考 ( Test2 x = new Test2();
)在C ++中会使用指针等价结构( Test2 *x = new Test2();
) 。
一个关键的区别是,它是简单的通过使用指针值语义的顶部提供参考语义,但是它不可能对(纯)引用语义顶部提供值语义。 一些本声明包括不能够控制物体在Java的内存布局或数据的地方(比基本类型和原始类型的数组以外的任何其他)的含义,而在另一个方向上的物体的精细控制在C ++中,您可以模仿Java对象。
回复问题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();
}
}
subject
这里是一个实例的引用 Test2
。 如果您尝试运行它,代码将很快用完某些资源(可能堆栈空间,也许堆空间)。
为什么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没有完全类型的概念,所以类可以在任何地方实例化你被允许实例的任何类。
难道上面的代码中创造无限的对象呢?
是的,试图实例这样的类会抛出你的程序进入一个递归死亡螺旋。
如果声明subject
为static
,你会得到Singleton模式,不会让你耗尽资源的渴望初始化版本。
因为你可以有多个构造其允许的。 如果你只有一个构造函数,这将确实导致一个无限循环。
public class Test{
private Test a;
public Test(String s){
this.a=new Test();
}
public Test(){
}
}