如果签名不同,Java编译器禁止在内部类方法中创建与外部类同名的方法

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)

我不问如何让它发挥作用.我想说明为什么第二个选项不起作用?我想要一个解释,而不是解决方案.

And*_*ner 5

它不起作用,因为您更改了名称的含义methodA.

因为调用的方法methodA存在于调用方法的类的主体中methodA,所以编译器不会查看周围的范围.

语言规范的具体位是Sec 15.12.1(强调我的):

如果表单是MethodName,即只是一个标识符,则:

...

如果存在该方法是成员的封闭类型声明,则让T为最内层的类型声明.要搜索的类或接口是T.

您仍然可以通过以下方式调用父方法:

Parent.this.methodA("1");
Run Code Online (Sandbox Code Playgroud)