【发布时间】:2018-05-27 18:19:58
【问题描述】:
这看起来很傻,但我真的很困惑。请看以下代码:
package com.one;
public class SuperClass {
protected void fun() {
System.out.println("base fun");
}
}
----
package com.two;
import com.one.SuperClass;
public class SubClass extends SuperClass{
public void foo() {
SuperClass s = new SuperClass();
s.fun(); // Error Msg: Change visibility of fun() to public
}
}
我也从 oracle doc 和 here 中了解到,受保护的成员在另一个包的子类中也是可见的。所以 fun() 应该在包二的 SubClass 中可见。那为什么会报错呢?
我是否严重遗漏了一些非常明显的东西?
【问题讨论】:
-
该方法对
SubClass本身的实例可见。所以你可以拨打this.fun()。但是,如果您创建一个不同的实例并尝试调用它的方法,它将不允许,因为SubClass的实例与SuperClass的那个 实例无关。 -
“可见”并没有给你一个完整的画面。您可以在其自身上调用该方法,即
this.fun()或只是fun(),但是当您创建SuperClass的新实例时,该方法是禁止使用的,因为SubClass成为SuperClass的“常规”客户端尽管也继承自它。
标签: java inheritance superclass protected access-modifiers