简短一句话说明:Java中protected字段可以被同包的类访问。
解释:子类通过继承,可以在自己类中访问自己的protected字段,但是不能访问异包类的protected字段(即使是自己的超类)。
示例说明如下:
Person是被用来继承的超类;WPerson是与Person同包、继承Person的子类;Tiger是与Person同包、没有继承关系的类;Theater是与Person异包,继承Person的子类。
为了测试,在Person中设计了一个protected类型的变量age;在每个类里面创建了一个方法,叫做doSth()。
在WPerson与Tiger类中,都是直接可以访问Person对象的protected字段(age)的;在Teacher中不能直接访问Person类的protected字段(age),但是可以访问自己的age字段。
具体的代码如下:
- Person类(起超类作用),定义了一个protected类型字段
package cn.beixiansheng.learning.Topic001;
public class Person {
protected int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- WPerson 同包的子类,可以对其超类protected字段访问
package cn.beixiansheng.learning.Topic001;
public class WPerson extends Person {
public void doSth() {
this.age = 490;
Person person = new Person();
person.age = 16;
person.setAge(17);
}
}
- Teacher,异包的子类,可以访问自己从超类继承过来的protected字段,但是不能访问超类的protected字段
package cn.beixiansheng.learning.Topic001.childpackage;
import cn.beixiansheng.learning.Topic001.Person;
public class Teacher extends Person {
public void doSth() {
this.age = 15;
Person student = new Person();
// 错误使用,不能获取到
// student.age = 12;
// 正确使用方法
student.setAge(12);
}
}
- Tiger,同包无继承关系的类,可以访问protected字段类
package cn.beixiansheng.learning.Topic001;
public class Tiger {
public void doSth () {
Person person = new Person();
person.age = 15;
}
}
代码的位置:
GitHub上代码
参考资料:
[1] Java核心技术 卷Ⅰ (原书第11版),中文版,173页,5.1.10受保护的访问