首先需要对 protected 进行溯源:
例如
class A {
protected void fun(){
}
}
class B extends A {
}
class main_l {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.fun();
b.fun();
}
}
a.fun()和b.fun()的源头都是在 class A 当中;
//====================================================
class A {
protected void fun(){
}
}
class B extends A {
protected void fun(){
}
}
class main_l {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.fun();
b.fun();
}
}
a.fun()的源头是在 A中 b.fun()的源头是在 class B中。
==========================================================
多重继承下
class A {
protected void fun(){
}
}
class B extends A {
protected void fun(){
}
}
class C extends B {
}
class D extends C {
protected void fun(){
}
}
class main_l {
public static void main(String[] args) {
A a = new A();
B b = new B();
C b = new C();
D b = new D();
a.fun();
b.fun();
c.fun();
d.fun();
}
}
a.fun()的源头是在 A中 b.fun()的源头是在 class B中 c.fun()的源头是在 class B中
d.fun()的源头是在 class D中;
==============================================================
对于基类以及子类的变量或者是方法当中,清楚了溯源之后;需要知道第二点。
1、**若子类与基类在同一包中,基类的 protected 成员是包内可见的,并且对子类可见;(这句话很重要!!!)**
2、若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而**不能**访问基类实例的protected方法;
若基类子类不在一包中 基类的protected成员 子类无法对其访问
一些例程 可以再看一下如下链接
https://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html