我知道这是错的,但我想知道我为什么会这样做
class Student{
String student;
int rollno;
Student stud=new Student("s",20);//(1st object)Thrown exception because of this line
Student(String student,int rollno){
this.student=student;
this.rollno=rollno;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stud=new Student("R",101);
}
}
Exception in thread "main" java.lang.StackOverflowError
at sai.Student.<init>(Student.java:8)
at sai.Student.<init>(Student.java:8).........
当我只创建一个对象(即第一个对象)时,我不会收到此错误但是当我创建两个对象时,我收到此错误。
答案 0 :(得分:0)
当应用程序过度递归并且调用堆栈达到其限制时,会发生StackOverflowError
。在您的情况下,创建Student
的实例会初始化其所有成员,包括stud
,它本身就是Student
- 因此它会初始化其所有成员,包括其{{1等等,直到错误被击中。
答案 1 :(得分:0)
创建新的Student对象时,会初始化它的所有字段。 这意味着
一切都发生了。前两个语句是无害的,但是当执行第三个语句时,它会尝试创建一个新的Student对象,导致另一个初始化为&gt;弦乐学生;弦乐学生; int rollno; 学生学生=新学生(“s”,20岁);
int rollno; Student stud=new Student("s",20);
再次导致另一个初始化,依此类推,直到你得到StackOverflow错误
答案 2 :(得分:0)
Student stud=new Student("R",101);
1.执行第一行以上,然后执行以下行
class Student{
String student;
int rollno;
Student stud=new Student("s",20);
2.由于Student stud = new Student(“s”,20),下面的行将再次执行并且此过程继续,因为我们得到stackoverflowError异常。
班级学生{
String student;
int rollno;
Student stud=new Student("s",20);
当我只创建一个对象(即第一个对象)时,我不会收到此错误但是当我创建两个对象时,我收到此错误。
** ANnswer:**因为我们没有写任何东西,所以控制不会进入第二步
答案 3 :(得分:0)
正如@Mureinik已经提到的那样,
Student stud=new Student("s",20);
上面的行是无限循环的原因,因为当你在初始化成员变量Student
期间创建Student
的实例时,它会进入无限循环。正如它自己创造的对象。
<强> ==被修改== 强>
没有必要将Student
类型变量声明为成员变量,我可以看到。因此,您应该从其成员变量中删除它。最终代码应该看起来像
class Student{
String student;
int rollno;
Student(String student,int rollno){
this.student=student;
this.rollno=rollno;
}
public static void main(String[] args) {
Student stud1 = new Student("R",101);
//use stud instance
Student stud12 = new Student("V",11); // create another instance
}
}