如果签名不同,Java 编译器禁止在内部 class 方法中创建与外部 class 同名的方法
Java compiler prohibit the creation in the inner class method with same name as in the outer class if the signatures are different
此代码为何有效:
class Parent {
private void methodA(String a){
System.out.println(a);
}
class Inner {
void test(int a){
methodA("1");
}
}
}
但是这段代码不起作用(我只是将方法添加到具有相同名称和另一个签名的内部 class):
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");
}
}
}
我不问如何让它工作。我想说为什么第二个选项不起作用?我想要一个解释,而不是一个解决方案。
它不起作用,因为您更改了名称的含义 methodA
。
因为一个名为 methodA
的方法出现在 class 的主体中,您在其中调用一个名为 methodA
的方法,编译器不会查看周围的范围.
语言规范的具体位是Sec 15.12.1(强调我的):
If the form is MethodName, that is, just an Identifier, then:
...
If there is an enclosing type declaration of which that method is a member, let T be the innermost such type declaration. The class or interface to search is T.
您仍然可以通过以下方式调用父方法:
Parent.this.methodA("1");
当编译器开始扫描代码时,它首先查找最近的范围可用性。如果它没有找到它,那么它只会去更高的范围。
在您的情况下,编译器将在 Inner
class 中找到方法 methodA
。所以它不会寻找 Parent
class.
中可用的方法
如果你想强制编译器寻找 Parent
class 方法,你必须使用下面的代码。
Parent.this.methodA("1");
此代码为何有效:
class Parent {
private void methodA(String a){
System.out.println(a);
}
class Inner {
void test(int a){
methodA("1");
}
}
}
但是这段代码不起作用(我只是将方法添加到具有相同名称和另一个签名的内部 class):
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");
}
}
}
我不问如何让它工作。我想说为什么第二个选项不起作用?我想要一个解释,而不是一个解决方案。
它不起作用,因为您更改了名称的含义 methodA
。
因为一个名为 methodA
的方法出现在 class 的主体中,您在其中调用一个名为 methodA
的方法,编译器不会查看周围的范围.
语言规范的具体位是Sec 15.12.1(强调我的):
If the form is MethodName, that is, just an Identifier, then:
...
If there is an enclosing type declaration of which that method is a member, let T be the innermost such type declaration. The class or interface to search is T.
您仍然可以通过以下方式调用父方法:
Parent.this.methodA("1");
当编译器开始扫描代码时,它首先查找最近的范围可用性。如果它没有找到它,那么它只会去更高的范围。
在您的情况下,编译器将在 Inner
class 中找到方法 methodA
。所以它不会寻找 Parent
class.
如果你想强制编译器寻找 Parent
class 方法,你必须使用下面的代码。
Parent.this.methodA("1");