public class TestClass(){
public static void main(String []args) {
TestClass t1 = new TestClass();
t1.anything();
}
}
这难道不奇怪建立在同一个类中定义一个对象? 由于随后响应 - 这个对象创建一个新的对象,那么这个新对象创建了另一个,和无限循环开始永远不会结束,直到内存已满。
public class TestClass(){
public static void main(String []args) {
TestClass t1 = new TestClass();
t1.anything();
}
}
这难道不奇怪建立在同一个类中定义一个对象? 由于随后响应 - 这个对象创建一个新的对象,那么这个新对象创建了另一个,和无限循环开始永远不会结束,直到内存已满。
这难道不奇怪建立在同一个类中定义的对象不是响应对象创建一个新的对象,然后这个新对象创建另一个和无限循环开始
不,当你运行你的程序的主要方法只运行一次。 它不会被再次执行。 因此,该对象将被创建一次。
想想你的主要方法是在类的外部。 它创建类的实例,并使用创建的实例。 所以,当你创建一个实例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
。
这不是非常奇怪。 我所知道的所有面向对象语言允许这一点。 该代码是对象定义的语义部分,但在实践中可以被认为是从任何给定对象的实际状态分开。 因此,有没有循环,因为对象构造不打电话给你的方法(当然,除非,它 - 那么你有问题)。
当您使用新创建的对象构造函数的调用它初始化实例变量出现这种情况,直到你的超类的所有构造函数被调用。 如果你把里面的构造函数的一些代码,将运行每次您创建一个对象
当一个程序启动时,它执行的主要方法。 在java中,你不能在一个类之外创建一个方法。 所有方法都必须在类内进行封装。 因此作为入口点的方案的主要方法必须是类内。 当你运行这个程序的主要方法将被运行一次,并会执行里面的代码。 在你的情况下,它创建了封装类的一个对象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();
}
}
是这里唯一有问题的例子。 编译器不抱怨。 它可以被翻译成字节码,它可以被执行。 在运行时,但是,您会导致堆栈溢出:
编译器允许这一点,因为,在一般情况下,编译器不能阻止所有无限递归 。 编译器允许任何可以被转换成字节码 。
编译器,但是, 可能如果它检测方法或方法调用链本身无条件地发出警告 。