在做hivesql解析代码阅读时,发现当子类和父类在不同的包里面,没有办法访问父类的protect修饰的方法,后来才发现自己理解错了,不是不同包的子类不能访问父类protected的方法和变量,而是在不同包不能利用该父类的引用实例来访问该父类的变量和方法。
首先看一下网上找到的资料
再看一段代码
package son;
import father.Person;
class Student extends Person{
public void myIntroduce(){
introduce();// 这里才是“子类访问父类的protected方法”
}
public static void main(String args []){
Person p = new Person();
p.myIntroduce();这是实例化父类后访问父类的保护方法。
}
}
其实是两个完全不同的概念。
java中几个修饰符的权限如下
public
|
protected
|
default
|
private
| |
同类
|
T
|
T
|
T
|
T
|
同包
|
T
|
T
|
T
|
|
子类(不同包)
|
T
|
T
|
|
|
不同包中无继承关系的类
|
T
|
|
|
|
可以看到 在protected修饰的变量或者方法中,不同包中无继承关系的类是无法访问父类的,但子类是可以访问父类的保护成员的,仅限于在子类中访问父类的保护成员,而且是子类访问,不是父类的实例访问,在不同包中的父类实例(相同包的父类的实例也是一样)是没有权限访问父类的保护成员的。