我在编程语言课程中有一个homework assignment。这个特殊的练习是关于名字,名字,隐藏,重载和多态重载。
我得到了一个令人困惑但有效的Java程序(如下所示),我需要做的是在程序中每次出现Oompa_Loompa
,对其词法角色进行分类(变量名,类名,方法名)等)。
我特别遇到这些问题:
/*A*/
Oompa_Loompa
的行中{li} new
附近的/*D*/
标记为Oompa_Loompa
的行中{li} super
附近的/*B*/
Oompa_Loompa
靠近标有?
/*C*/
附近
以下是代码:
class Oompa_Loompa {
Oompa_Loompa Oompa_Loompa; /*A*/
<Oompa_Loompa> Oompa_Loompa() {}
Oompa_Loompa(final Oompa_Loompa... Oompa_Loompa) {
this(Oompa_Loompa, Oompa_Loompa);
}
Oompa_Loompa(final Oompa_Loompa[]... Oompa_Loompa) {
this();
}
Oompa_Loompa Oompa_Loompa(final Oompa_Loompa Oompa_Loompa) {
Oompa_Loompa: for (;;)
for (;;)
if (new Oompa_Loompa(Oompa_Loompa) { /*D*/
@Override Oompa_Loompa Oompa_Loompa(final Oompa_Loompa Oompa_Loompa) {
return Oompa_Loompa != null ? /*C*/
super.Oompa_Loompa(Oompa_Loompa) /*B*/
: Oompa_Loompa.this.Oompa_Loompa(Oompa_Loompa);
}
}.Oompa_Loompa(Oompa_Loompa) != null)
break Oompa_Loompa;
else
continue Oompa_Loompa;
return Oompa_Loompa;
}
}
答案 0 :(得分:2)
这:super.Oompa_Loompa(Oompa_Loompa)
是一种间接递归的方法调用。
您将覆盖Oompa_Loompa
方法获得的Oompa_Loompa
类型的Oompa_Loompa
变量作为参数传递给封闭的Oompa_Loompa
方法。
这是一个更健全的版本:
class Klass {
Klass field;
<Type_Parameter> Klass() { }
Klass(final Klass... param) {
this(param, param);
}
Klass(final Klass[]... param) {
this();
}
Klass method(final Klass param) { // <------------------------\
outer_loop: // |
for (;;) { // |
for (;;) { // |
if (new Klass(param) { // |
@Override // |
Klass method(final Klass inner_param) { // |
return inner_param != null // |
? super.method(inner_param) // -------/
: Klass.this.method(inner_param);
}
}.method(param) != null)
break outer_loop;
else
continue outer_loop;
}
}
return param;
}
}