如果希望超类中的某些方法允许被子类访问,或者允许子类的方法访问超类的某个域,为此需要将这些方法或域设置为protected。在实际的程序中很实用这个关键字。
下面归纳一下Java用于控制可见性的4个访问修饰符:
- 仅对本类可见---private
- 对所有类可见---public
- 对本包和所有子类(本包的)可见---protected
- 对本书可见——默认,不需要修饰符
public class protect {
private String name;
protected int age;
public protect(String name, int age) {
//super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "protect [name=" + name + ", age=" + age + "]";
}
}
public class protectChild extends protect{
private String major;
public protectChild(String name, int age,String major) {
super(name, age);
this.major = major;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public String toString() {
return "protectChild [major=" + major + "]" +"[age=" + age +"]" ;
}
}
结果:
1
protect [name=gaga, age=20]
20
protectChild [major=chinese][age=40]
上面的代码中我们可以看到,在子类中可以直接访问超类中的protected域,在本包中的其他类也可以直接访问,但是注意到一点,子类和调用该类的其他类可以直接访问该保护类型的变量对进行修改。
public class Protext {
public static void main(String[] args) {
protect p = new protect();
System.out.println(p.age);
p.age = 10;
System.out.println(p.age);
}
}
结果:
1
10
如果受保护变量是静态的,在同一个线程下的不同对象对该变量进行操作会影响其他的对象。运行状态下的不同线程中不同对象对同一静态变量进行操作也会妨碍其他对象对该静态变量的访问。