为什么我在第11行得到StackOverflowError。
我收到错误的行:System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
以下是完整代码:
public class Dog extends Animal {
private String animalName;
private int animalQuantity;
public Dog(String animalName, int animalQuantity) {
animalName(animalName);
quantity(animalQuantity);
// JavaInnerClass.tempDog name = new JavaInnerClass.tempDog();
// System.out.println(name.totalQuantity(animalQuantity));
System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
}
@Override
public String animalName(String animalName) {
this.animalName = animalName;
return animalName;
}
@Override
public int quantity(int animalQuantity) {
this.animalQuantity = animalQuantity;
return animalQuantity;
}
}
JavaInnerClass:
public class JavaInnerClass {
Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };
tempDog temp = new tempDog();
public static class tempDog {
public int totalQuantity(int quantity) {
return quantity + 200; // assuming a statement
}
}
public int callInnerClassMethod(int quantity) {
return temp.totalQuantity(quantity);
}
public static void main(String[] args) {
new JavaInnerClass();
}
}
答案 0 :(得分:1)
JavaInnerClass
构造函数调用Dog
构造函数,该构造函数调用调用JavaInnerClass
构造函数的Dog
构造函数......等等......
查看JavaInnerClass
构造函数。
初始化数组字段dog
:
Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };
但是Dog
构造函数是什么?
它创建了JavaInnerClass
:
public Dog(String animalName, int animalQuantity) {
...
System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
}
所有这一切都持续到stackoverflow。
答案 1 :(得分:0)
您正在JavaInnerclass中创建狗
Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };
每次实例化新对象时都会创建它们。
当您创建一个新的Dog时,您将创建一个新的JavaInnerClass
new JavaInnerClass().callInnerClassMethod(animalQuantity)
这是一个循环。
答案 2 :(得分:0)
发生这种情况的原因是,当构建Dog
时,您提到的行会创建一个新的JavaInnerClass
对象:
public Dog(String animalName, int animalQuantity) {
animalName(animalName);
quantity(animalQuantity);
// JavaInnerClass.tempDog name = new JavaInnerClass.tempDog();
// System.out.println(name.totalQuantity(animalQuantity));
System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
}
但是,然后JavaInnerClass
构造函数创建了一个新的Dog
:
public class JavaInnerClass {
// this program is written to understand inner class..
Dog[] dog = { new Dog("Husky", 90), new Dog("Sheppered", 100) };
...
}
反过来,它会创建一个新的JavaInnerClass
,依此类推......直到系统用完堆栈空间。
因此,在调用递归方法时,您需要确保没有方法调用循环。对于内联定义的类,似乎也有一些问题,所以如果你告诉我们你正在尝试做什么,我们或许可以帮助你多做一些。