平时对java中protected方法的可见性理解有偏差,通过这次实验,对其可见性规则进行一次记录,以便温故。
Java中protected方法可见性解释
protected的方法权限,一般说法如下:
- 基类的protected成员是包内可见的,并且对子类可见。
- 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。
我们对如上规则,进行实验,将创建2个包,将父类放入包1中,然后在两个包中分别创建其子类,并且在2个包中验证其实例是否有访问protected方法的权限。
实验
我们创建包1package com.kiramario.protectedActionScope_1
,包2package com.kiramario.protectedActionScope_2
。在包1中创建基类Father,子类1Son1,在包2创建子类2Son2。
包1:
package com.kiramario.protectedActionScope_1;
public class Father {
protected void parent_method() {
System.out.println("parent_method");
}
}
package com.kiramario.protectedActionScope_1;
public class Son1 extends Father{
public void inner() {
parent_method(); //在子类1中,可以顺利调用到基类的protected方法
}
}
包2:
package com.kiramario.protectedActionScope_2;
import com.kiramario.protectedActionScope_1.Father;
public class Son2 extends Father {
public void inner() {
parent_method(); //在子类2中,可以顺利调用到基类的protected方法
}
}
在包1中进行实例调用:
package com.kiramario.protectedActionScope_1;
import com.kiramario.protectedActionScope_2.Son2;
public class Scope_1_Test {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.parent_method(); //子类1实例可以方法protected方法
Father f = new Father();
f.parent_method(); //基类实例可以方法protected方法
Son2 son2 = new Son2();
son2.parent_method(); //子类2实例可以方法protected方法
}
}
在包2中进行实例调用:
package com.kiramario.protectedActionScope_2;
import com.kiramario.protectedActionScope_1.Father;
import com.kiramario.protectedActionScope_1.Son1;
public class Scope_2_Test {
public static void main(String[] args) {
Son2 son2 = new Son2();
son2.parent_method(); // 编译Error,子类2实例不可以方法protected方法
Son1 son1 = new Son1();
son1.parent_method(); // 编译Error,子类1实例不可以方法protected方法
Father f = new Father();
f.parent_method(); // 编译Error,基类实例不可以方法protected方法
}
}
结论
通过上述实验,我们知道,方法的调用可以在类内部实现,也可以通过类的实例进行调用,但是对于基类的protected方法,其可见性如下。
-
类内部调用的可见性:
包1(基类所在) 包2 子类 可见 可见 -
实例调用的可见性:
包1(基类所在) 包2 基类实例 可见 不可见 子类1实例 可见 不可见 子类2实例 可见 不可见
最后手画一张图: