【问题标题】:i am confused with java code? [duplicate]我对java代码感到困惑? [复制]
【发布时间】:2016-06-22 04:20:37
【问题描述】:

这段代码对我来说没有意义

class MyClass{
    MyClass obj = new MyClass();

    public static void main(String[] args){
        MyClass obj = new MyClass();
    }
}

所以问题是类定义如何包含它自己的对象创建? 例如像上面的代码MyClass 实例变量obj 创建它自己的对象。在这里,我想了解它是否有效,那么它在幕后实际上是如何工作的,而且这样做有什么好处.. 需要详细解释..提前谢谢

【问题讨论】:

  • 这很容易,问题是,你最终会递归创建无限数量的对象,你的资源很快就会耗尽,应用程序会崩溃。
  • 您不会从这种方式中受益,因为您将遇到StackOverflow,因为MyClass 的每个实例都会生成MyClass 的新实例。这个无限的一代从你的主开始。我猜你的意思是有一个static MyClass obj 变量,这可能是单例类设计的指标。
  • @AbdulRaziq 想象一下当前初始化类MyClass 时会发生什么。它有一个变量MyClass obj,它被初始化了。它为刚刚初始化的MyClass 创建一个MyClass 的新实例。这个新实例有什么作用?它还包含一个变量MyClass obj,它也被初始化。这将一直持续到 jvm 因当前设计而崩溃。
  • @KevinEsche 第二个答案?它们没有内在的顺序。
  • 所以@AbdulRaziq,我假设您正在查看另一个问题,即 Hovercraft Full Of Eels 的答案。他对该代码有注释,// have fun!。你试过了吗?他这样做是为了让人们可以看到会发生什么。你看到了吗?

标签: java oop


【解决方案1】:

问题是这个类不区分你是创建它自己的对象还是任何其他对象。 在幕后,它的工作原理与任何其他对象构造相同,因此从字段初始化开始,在这种特殊情况下,使用以下行:

MyClass obj = new MyClass();

然后正如人们在 cmets 中提到的那样,它开始一遍又一遍地这样做,导致堆栈溢出。

【讨论】:

    【解决方案2】:

    您不会在 Myclass 定义中启动 MyClass。

    看看 Bill Venners 的这篇文章,构造函数基础: http://www.javaworld.com/article/2076614/core-java/object-initialization-in-java.html

    class MyClass{
        private int value;
        public MyClass() {
            value = 1234;
        }
    
        public MyClass(int setValue) {
            value = setValue;
        }
    }
    
    class Example3 {
        public static void main(String[] args) {
            // Create a MyClass object with default value
            MyClass example1 = new MyClass();
            // Create a MyClass with value 355
            MyClass example2 = new MyClass(355);
        }
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 2017-04-25
      • 2015-07-12
      • 2014-03-29
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多