class Test
{
public static void main(String[] args) {
new B();
}}class A
{
//A a = new A(); 执行这行的话就报错java.lang.StackOverflowError A()
{
System.out.println("aaa");
}
}
class B extends A
{
B b = new B();
B()
{
System.out.println("bbb");
}
}
运行结果是无数个aaaaaaaaaaaaaaaaaaaaaaaa.................死循环了这是为什么如运行//A a = new A();的话就报错java.lang.StackOverflowError
解决方案 »
- List剔除重复元素的问题
- preparestatement的setInt的问题 请进
- java邮件开发出现java.lang.ClassCastException: javax.mail.Session cannot be cast to j错误
- 求救:关于repaint()后画布原有图象消失问题
- Java中多态定义是什么?特点是什么?为什么要用多态?
- 各位前辈指点下小弟
- 在SWING中如何设计windowclosing()?
- 求助!关于java 多态和重写的一个问题
- 《java分布式应用程序设计》的书哪儿有下载?
- 关于类的方法的讨论?
- 问一个巨简单的数组定义和赋值的问题.
- 为什么这样不能用。
如此一直循环到死
而new B()又会导致b = new B()----->再导致new A();
这样就死循环了。
所以StackOverflowError
(执行不执行A a = new A();)都会导致StackOverflowError,只是时间问题。
因为当你new B()时,JVM会按首先初始化父类A中成员变量,并执行它的构造函数,然后初始化B中的成员变量,当初始化类B中的成员b时,它要求创建一个新的B对象,JVM又重新开始创建对象了,结果就是死循环,
最后堆栈溢出了至于出现aaaaaaaaaaaaaaaaaaaa是因为在new B()时,初始化父类A的构造函数时,打印出aaa了
{
//A a = new A(); 执行这行的话就报错java.lang.StackOverflowError A()
{
System.out.println("aaa");
}
}
class B extends A
{
B b = new B();
B()
{
System.out.println("bbb");
}
}
你为什么在A和B类里面还 new 他们阿
class Test中 当时不能在 class A中使用...
另外打印 无数个 aa的话
就是因为
当你new B();
会 执行到B() 这一句
然后 B 是 继承 A 的 所以 跑上次打印了个a
又跑回B 类里
执行完
B b = new B();
后 又一次 执行到 B()
然后又一次 跑 上次打印 a
所以就会又无数个了
就是这样的,new B()的时候先返上去调B的父类A,A有个构造函数A(),故执行 System.out.println("aaa");
然后b实例化,引起无限循环