Java中protected修饰符之相同包下和不同包下的权限控制
- 权限控制表:
修饰词 | 本类 | 同一个包的类 | 继承类 | 其他类 |
---|---|---|---|---|
private | √ | × | × | × |
无(默认) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
- 结论
1. 父类的protected成员是包内可见的,并且对子类可见。
2. 若子类与父类不在同一包中,那么在子类中,子类实例可以访问其从父类继承而来的protected方法,而不能访问 父类实例的protected方法。
- 相同包下:
先看下面代码:这个是相同包下
父类:Father
package com.same;
public class Father {
protected int a = 1;
protected void father() {
System.out.println("wo shi father");
}
}
子类:Son
package com.same;
public class Son extends Father {
/**
* 同包类,子类继承父类可以直接调用被protected修饰的成员变量和方法
*/
public void son() {
System.out.println("调用father protected修饰的变量a= "+ a);
father();
}
}
测试类:Test
package com.same;
public class Test {
public static void main(String[] args) {
Father father = new Father();
System.out.println("main 方法中调用被protected修饰的变量a= " + father.a);
father.father();
System.out.println("==============");
Son son = new Son();
son.son();
}
}
输出:
- 不同包下:
不同包下:创建一个新包,same包下的父类不变
子类:Son2
package com.different;
import com.same.Father;
public class Son2 extends Father {
public void son2() {
father();
System.out.println("不同包下, 子类直接调用父类被protected修饰的成员变量" + a);
}
}
测试类:
package com.different;
import com.same.Father;
public class Test {
public static void main(String[] args) {
Father father = new Father();
// main函数中只有子类可见,不同包下,父类实例调用编译报错
// father.a.;
// father.father();
Son2 son2 = new Son2();
son2.son2();
}
}
此处使用父类实力调用被protected修饰的成员变量及方法编译是直接失败的
以上结论得以验证,相同包下和不同包下的被protected修饰成员变量和方法的访问权限。