什么时候可以在该类的方法中创建类的对象?

public class TestClass(){ public static void main(String []args) { TestClass t1 = new TestClass(); t1.anything(); } } 

在同一个类的定义中创建一个对象并不奇怪吗? 因为然后在响应中 – 这个对象创建一个新对象,然后这个新对象创建另一个,并且无限循环开始永远不会结束,直到内存已满。

在同一个类的定义中创建一个对象比在响应中创建一个新对象并不奇怪,然后这个新对象创建另一个并且无限循环开始

不,主程序只在您运行程序时运行一次。 它不会再被执行。 因此,该对象将只创建一次。

想想你在课堂外的主要方法。 这将创建您的类的实例,并使用创建的实例。 因此,当您从main方法创建实例时,将调用构造函数来初始化实例的状态,然后在构造函数返回时,执行main方法的下一个语句。

实际上,您可以认为main方法不是您类的实例状态的一部分。

但是,如果您在构造函数(例如0-arg)中创建了类的实例,并将引用作为实例引用变量,那么它将变为无限递归。

 public class A { private A obj; public A() { obj = new A(); // This will become recursive creation of object. // Thus resulting in StackOverflow } } 

如果您尝试执行以下操作,则只会出现无限循环(堆栈溢出错误):

 public class TestClass { public TestClass() { TestClass t = new TestClass(); } } 

在其他地方,您尝试创建TestClass类的对象。

这并不奇怪。 我所知道的所有面向对象语言都允许这样做。 代码在语义上是对象定义的一部分,但在实践中,它可以被认为与任何给定对象的实际状态分开。 因此没有循环,因为对象构造不会调用您的方法(当然,除非它确实 – 然后您有问题)。

当你使用new来创建对象时,会调用构造函数初始化实例变量,直到你的超类的所有构造函数都被调用为止。 如果你把一些代码放在构造函数中,每次创建一个对象时都会运行

当程序启动时,它执行main方法。 在java中,您无法在类之外创建方法。 所有方法都必须封装在一个类中。 因此,作为程序入口点的主要方法必须在一个类中。 当您运行此程序时,main方法将运行一次并将执行其中的代码。 在您的情况下,它创建一个封闭类TestClass的对象。 这不一定会发生。 它也可以在这个类之外创建对象。 你只会得到@adarshr的答案中解释的无限循环。

 public class TestClass{ public static void main(String []args) { TestClass t1 = new TestClass(); t1.anything(); } } 

这是一个完全有效的代码。 调用main方法时,不存在TestClass先前实例(它不需要,因为main方法是static )。

 public class Test2{ public Test2 clone(){ return new Test2(); } } 

这也完全有效。 当您创建Test2的新实例时,它包含clone方法,但该方法不会自动执行。 只有在调用clone方法时,才会创建另一个Test2实例。

 public class MyLinkedList{ MyLinkedList next; MyLinkedList(int elems){ if(elems>0){ next = new MyLinkedList(elems-1); }else{ next = null; } } } 

即使构造函数使用相同的构造函数创建新实例也是完全有效的,因为创建由条件保护,因此创建实例有时会触发新的创建。

 public class Fail{ public Fail(){ new Fail(); } } 

这是唯一有问题的例子。 编译器没有抱怨。 它可以转换为字节代码,并且可以执行。 但是,在运行时,会导致堆栈溢出:

  • 分配新的失败
  • 它的无参数构造函数被调用
  • 构造函数尝试创建一个新的Fail
  • 分配新的失败
  • 它的无参数构造函数被调用

编译器允许这样做,因为通常编译器不能阻止所有无限递归 。 编译器允许任何可以转换为字节码的东西

但是,如果编译器检测到方法或方法链无条件地调用自身 ,则可能会发出警告