【问题标题】:In Java why is the New instance of a class not assigned to a variable在Java中,为什么没有将类的新实例分配给变量
【发布时间】:2017-10-02 23:57:24
【问题描述】:

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

}

【问题讨论】:

标签: java class instance instantiation


【解决方案1】:

它不能被引用。 新实例被创建并立即丢弃。

但是,它的构造函数代码被调用,因此确实会发生副作用(如果有这样的 - 在您的示例中存在 - 它会打印到标准输出)。然而,这样做是一种不好的做法。

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

【讨论】:

  • 谢谢亚当........我可以给大家发一个链接到我看到这个的教程 - 但如果它违反了这里的规则就不会
【解决方案2】:

当您通过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();
   }
}

附:当然,在某些情况下,您可能希望在每次实例化时都在实例之外进行操作,例如,保留类的所有实例的静态列表,因此每次构造时都将特定实例添加到其中。尽管如此,最好还是创建一个私有的 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();
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多