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

car*_*995 12 c++ java oop reference instance-variables

可能重复:
类如何拥有自己类型的成员,这不是无限递归吗?

代码:

public class Test2{
    private Test2 subject = new Test2(); //Create Test2 object in Test2
    private int num;
}
Run Code Online (Sandbox Code Playgroud)

问题:

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

  2. 上面的代码是否创建了无限数量的对象?由于Test2它本身包含一个Test2对象,该对象又包含一个Test2本身具有Test2对象的对象等.

Dav*_*eas 18

关于您的问题,两种语言之间的主要区别在于Java是一种具有引用语义的语言(原始类型除外),而C++是一种具有值语义的语言,它允许通过引用和指针引用语义.

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

一个关键的区别是,通过使用指针在值语义之上提供引用语义很简单,但是不可能在(纯)引用语义之上提供值语义.这个陈述的一些含义包括无法控制内存中Java对象的布局或数据的位置(除了基本类型和基本类型数组之外的任何东西),而在另一个方向上则可以更精细地控制对象在C++中允许您模仿Java对象.

  • 可能超过10+票.感谢简短而清晰的描述. (3认同)
  • 很好的答案!其他人没有给出任何合理的解释.我不认为许多纯Java程序员(如果有的话)可以理解这一点.这个问题需要有关C++和Java的知识. (2认同)

ass*_*ias 14

问题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();
    }
}
Run Code Online (Sandbox Code Playgroud)