如果签名不同,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");