我在学校上Java课。我们分配了这个任务来设计一个类,使其具有菜单功能,并带有多个子菜单。
结构有点像这样(下面的伪代码只是为了显示结构):
public static void mainMenu() {
switch(integer variable){
case 1: submenu1();
break;
case 2: submenu2();
break;
}
}
public static void submenu1() {
switch(integer variable){
case 1: subsubmenu1();
break;
case 2: subsubmenu2();
break;
default: mainMenu(
}
}
public static void subsubmenu1() {
switch(integer variable) {
case 1: anothersubmenu1()
break;
case 2: anothersubmenu2();
break;
default: submenu1();
}
}
我的问题是:我的老师说这是错误的,因为如果我这样做,JVM将程序从一个地方到另一个地方的路径存储在内存中,从长远来看,这将导致堆栈溢出。他还没有完全解释它,他只是说我应该使用一个布尔变量将while循环括起来,并添加一个选项来翻转该布尔值以退出while循环,因为这种方式Java不会存储程序从一种方法转换到另一种方法的路径。
再次,他没有详细解释它,这听起来使他解释它的方式非常混乱(我尝试根据他给我的提供尽可能清楚地使它变得清晰)。我一直在网上寻找最近3个小时内与他告诉我的内容类似的信息,但找不到任何信息...所以我决定向专家咨询。
你们能帮我吗?
最佳答案
是的,您的老师是(部分)正确的。
关键部分是您可能从mainMenu()
内部调用submenu1()
,而在submenu1()
内部调用subsubmenu1()
。
如果您每次在mainMenu()
中都调用submenu1()
,而在submenu1()
中则每次调用mainMenu()
,则程序将崩溃。
对于每个函数调用,底层系统都需要为函数的局部变量等保留内存。这就是所谓的堆栈框架。当您从自身内部(直接或间接)调用函数时,它称为recursion。递归需要在某个时候返回。如果不是这样,则会因为内存用完而导致stackoverflow。