类的对象作为类内的实例变量

2022-09-05 00:17:38

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

代码:

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

问题:

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

  2. 上面的代码是否会创建无限数量的对象?由于它本身包含一个对象,该对象再次包含一个对象,该对象本身具有对象,依此类推。Test2Test2Test2Test2


答案 1

关于您的问题,这两种语言之间的主要区别在于Java是一种具有引用语义的语言(基元类型除外),并且C++一种具有值语义的语言,该语言允许通过引用和指针引用语义。

在两种语言中看起来相似的语法具有完全不同的含义,在Java中创建引用()时,C++中的等效构造将使用指针()。Test2 x = new Test2();Test2 *x = new Test2();

一个关键的区别是,通过使用指针在值语义之上提供参考语义很简单,但在(纯)参考语义之上提供值语义是不可能的。此语句的一些含义包括无法控制内存中 Java 中对象的布局或数据的位置(对于基元类型和基元类型数组以外的任何内容),而在另一个方向上,对C++中的对象进行更精细的控制允许您模仿 Java 对象。


答案 2

重新问题2 - 如果你运行这个代码,你会得到一个StackOverflowException => 是的,它创建了无限数量的对象(好吧,它尝试...)

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();
    }
}