我有一个这样的考试班。
内部类有一个方法 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();
}
}
}
1条答案
按热度按时间yyhrrdl81#
重载解析的第一步是确定在哪个类中搜索适用的方法(jls)§15.12.1):
15.12.1. 编译时步骤1:确定要搜索的类或接口
如果你按照这一节来做,你会发现在这种情况下,
如果表单是methodname,即只是一个标识符,那么:
如果标识符出现在具有该名称的方法声明的范围中(§6.3, §6.4.1),然后
如果有一个方法是其成员的封闭类型声明,那么让t作为这种类型声明的最内层。要搜索的类或接口是t。
为了
a()
以及a("")
,T
是Inner
. 为了b()
,T
是Test
.Inner
是最内部的类型声明,其中包含名为的方法a
. 这是因为Inner
继承无参数a
从Test
(但不是a
它接受一个字符串,因为它是私有的)。为了
a()
,继承的,无参数a
在Inner
在重载解析的后续步骤中成功找到。为了a("")
但是,没有a
接受一个String
在Inner
! 编译器足够聪明,可以在超类中查找私有方法并输出“不可访问”消息。打电话给
a
在中声明Test
,您应该限定它:作为实验,你可以试着
Inner
不继承Test
看看会发生什么。现在没有名称为的方法声明a
在Inner
,则“最内部的此类类型声明”将是Test
,所有3个简单的名字调用都可以工作。