为什么内部类不能访问外部类方法,而外部类方法是普通方法和静态方法之间的重载?

cbeh67ev  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(309)

我有一个这样的考试班。
内部类有一个方法 c() . c() 有三行代码。
第一行和第三行是好的,但是第二行是错误的 a(java.lang.String) has private access .
为什么选择这种方法 b() 很好但是方法 a(String s) 哪个是错误?

public class Test {

    public void a() {
    }

    private static void a(String s) {
    }

    private static void b() {
    }

    private class Inner extends Test{
        void c() {
            a();
            a("");
            b();
        }
    }
}
yyhrrdl8

yyhrrdl81#

重载解析的第一步是确定在哪个类中搜索适用的方法(jls)§15.12.1):

15.12.1. 编译时步骤1:确定要搜索的类或接口

如果你按照这一节来做,你会发现在这种情况下,
如果表单是methodname,即只是一个标识符,那么:
如果标识符出现在具有该名称的方法声明的范围中(§6.3, §6.4.1),然后
如果有一个方法是其成员的封闭类型声明,那么让t作为这种类型声明的最内层。要搜索的类或接口是t。
为了 a() 以及 a("") , TInner . 为了 b() , TTest . Inner 是最内部的类型声明,其中包含名为的方法 a . 这是因为 Inner 继承无参数 aTest (但不是 a 它接受一个字符串,因为它是私有的)。
为了 a() ,继承的,无参数 aInner 在重载解析的后续步骤中成功找到。为了 a("") 但是,没有 a 接受一个 StringInner ! 编译器足够聪明,可以在超类中查找私有方法并输出“不可访问”消息。
打电话给 a 在中声明 Test ,您应该限定它:

Test.this.a(); // or super.a(), note the different objects on which the method is called
Test.a("");

作为实验,你可以试着 Inner 不继承 Test 看看会发生什么。现在没有名称为的方法声明 aInner ,则“最内部的此类类型声明”将是 Test ,所有3个简单的名字调用都可以工作。

相关问题