为什么此代码有效:
class Parent {
private void methodA(String a){
System.out.println(a);
}
class Inner {
void test(int a){
methodA("1");
}
}
}
但是此代码不起作用(我只是将方法添加到具有相同名称和另一个签名的内部类中):
class Parent {
private void methodA(String a){
System.out.println(a);
}
class Inner {
private void methodA(int a){
System.out.println(a);
}
void test(int a){
methodA("1");
}
}
}
我不问如何使其工作。我想说明为什么第二个选项不起作用?我想要一个解释,而不是解决方案。
答案 0 :(得分:5)
这不起作用,因为您更改了名称methodA
的含义。
由于在您正在调用名为methodA
的方法的类的主体中存在称为methodA
的方法,因此编译器不会查看周围的作用域。
语言规范的特定位是Sec 15.12.1(强调我的意思):
如果表单是MethodName,即只是一个标识符,则:
...
如果存在一个封闭的类型声明,该方法是该方法的成员,则让T成为此类类型声明的最内层。搜索的类或接口是T。
您仍然可以通过以下方式调用父方法:
Parent.this.methodA("1");
答案 1 :(得分:0)
当编译器开始扫描代码时,它首先查找最近的示波器可用性。如果找不到它,那么它只会进入更高的范围。
对于您而言,编译器将在methodA
类中找到方法Inner
。因此,它将不会寻找Parent
类中可用的方法。
还是要强制编译器寻找Parent
类方法,而不必使用下面的代码。
Parent.this.methodA("1");