如果签名不同,则Java编译器禁止在内部类方法中使用与外部类相同的名称进行创建

时间:2018-11-27 09:40:33

标签: java inheritance javac inner-classes

为什么此代码有效:

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");
        }
    }
}

我不问如何使其工作。我想说明为什么第二个选项不起作用?我想要一个解释,而不是解决方案。

2 个答案:

答案 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");