为什么我在第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();
}
}
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。
您正在用JavainnerClass创建狗
Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };
每次实例化新对象时,它们都是创建的。
当您创建新狗时,您会创建一个新的JavainnerClass
new JavaInnerClass().callInnerClassMethod(animalQuantity)
这是一个周期。
之所以发生的原因是,当构建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
,依此类推...直到系统用尽堆栈空间为止。
因此,您需要确保在调用递归方法时没有方法调用周期。似乎您在定义的内联班上遇到了一些问题,所以也许如果您告诉我们要做什么,我们也许可以帮助您更多。