在Java中,为什么类的New实例未分配给变量

时间:2017-10-02 23:57:25

标签: java class instance instantiation

Java初学者。我已经多次看到下面的这行了,并且无法理解...... new TestCode() - 它看起来是一个实例但没有分配给任何东西 - 那么怎么能被引用呢?

class TestCode
{
   public TestCode()
   {
       System.out.println();
       System.out.println( "Welcome to the Program");
    }

    public static void main( String args[] ){new TestCode();}

}

2 个答案:

答案 0 :(得分:0)

不能参考。 创建新实例并立即将其丢弃。

然而,它的构造函数代码被调用,因此副作用(如果有这样的 - 并且在你的例子中有 - 它打印到stdout)确实发生了。然而,做这样的事情是一种不好的做法。

请参阅Zaki关于将其分配给变量的答案。然后你可以参考它,并做一些事情。

答案 1 :(得分:0)

当您通过new代码字实例化对象时,会分配堆上的空间(用于存储对象及其字段的系统内存部分),并执行构造函数。在这种情况下,构造函数会在标准输出上写入,无论是否为对象创建引用,都会执行此操作。

之后,你是对的,无法访问该对象,因为不存在对它的引用。因此,垃圾收集器最终会释放内存空间。

就像亚当所说的那样,这通常是气馁的,因为它会让你的期望变得混乱,因为构造函数应该初始化对象,并且应该可以通过它的方法与外部世界进行交互。

因此,即使它更长一点,更好的结构化代码可能看起来像这样:

class TestCode {
   public TestCode() {}

   public void welcome() {
      System.out.println();
      System.out.println("Welcome to the Program");
   }

   public static void main( String args[] ){
      TestCode tc = new TestCode();
      tc.welcome();
   }
}

P.S。当然,在某些情况下,您可能希望在每次实例化时都在实例外部执行操作,例如保留类的所有实例的静态列表,并因此在每次构造时向其添加特定实例。尽管如此,最好创建一个私有的init()方法并从构造函数中调用它,以便更好地分离具有不同功能的元素。

作为另一个例子,这里有一个不同的,功能相同的方式可以重新编写代码:

class TestCode {
   public TestCode() {
      init();
   }

   private void init() {
      System.out.println();
      System.out.println("Welcome to the Program");
   }

   public static void main( String args[] ){
      TestCode tc = new TestCode();
      // Or simply: new TestCode();
   }
}