ip6*_*696 0 java inheritance javac inner-classes
为什么这段代码有效:
class Parent {
private void methodA(String a){
System.out.println(a);
}
class Inner {
void test(int a){
methodA("1");
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用(我只是将方法添加到具有相同名称和另一个签名的内部类):
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不问如何让它发挥作用.我想说明为什么第二个选项不起作用?我想要一个解释,而不是解决方案.
它不起作用,因为您更改了名称的含义methodA.
因为调用的方法methodA存在于调用方法的类的主体中methodA,所以编译器不会查看周围的范围.
语言规范的具体位是Sec 15.12.1(强调我的):
如果表单是MethodName,即只是一个标识符,则:
...
如果存在该方法是成员的封闭类型声明,则让T为最内层的类型声明.要搜索的类或接口是T.
您仍然可以通过以下方式调用父方法:
Parent.this.methodA("1");
Run Code Online (Sandbox Code Playgroud)