Java 中的 protected 关键字
使用场景:你想让一个类中的某个方法或成员变量在包中都可见,而且其子类也能访问(子类有可能和父类不在同一个包中),但又不想让所有类都可以访问该类时,就可以用protected修饰符。
protected
关键字可以用来修饰方法和成员变量- 声明为
protected
的方法和成员变量可以被同一个包内所有类访问 - 声明为
protected
的方法和成员变量可以被该类的子类所访问,即便子类和父类不在一个包中- 注:不在一个包中的子类,只能使用该子类中的引用来使用其父类的
protected
成员,但是和父类在同一个包中的子类没有这个约束。 这样就保证了其他包中的类只能访问它们所继承的部分成员。
- 注:不在一个包中的子类,只能使用该子类中的引用来使用其父类的
代码演示
在包 animal
中创建一个父类 Animal.java
package animal;
public class Animal {
protected int head;
}
在包 cat
中创建一个继承 Animal
的子类 Cat
以下代码说明子类可以直接使用父类的Protected变量,表示父类的protected变量是可以被继承的
package cat;
import animal.Animal;
public class Cat extends Animal {
public void hasHead(int val) {
head = val;
}
}
以下代码说明当子类父类在不同的包中时,子类可以使用子类的对象来访问父类的protected变量
package cat;
import animal.Animal;
public class Cat extends Animal {
public void hasHead(int val) {
Cat miao = new Cat();
miao.head = val;
}
}
以下代码说明当子类父类不在同一个包中时,子类不能通过父类的对象来访问父类的protected变量
package cat;
import animal.Animal;
public class Cat extends Animal {
public void hasHead(int val) {
Animal miao = new Cat();
// miao.head = val;
}
}
报错:Error:(8, 13) java: head 在 animal.Animal 中是 protected 访问控制
以下代码说明当子类父类不在同一个包中时,子类不能通过其他子类的对象来访问父类的protected变量
package cat;
import animal.Animal;
public class Miao extends Animal{
public void hasHead(int val) {
Cat cc = new Cat();
// cc.head = val;
}
}
报错:Error:(8, 13) java: head 在 animal.Animal 中是 protected 访问控制