问题描述
Java类中的属性在不指定访问权限,即private、protected或者public的情况下被称为“默认访问模式”,该模式下,只允许在同一个包中访问。
当需要继承的类来自另外一个包(packet)时,如果父类中的方法是私有的或者是默认访问模式(即未指定的),那么子类是不能继承的,
父类代码:1
2
3
4
5
6
7
8
9
10package 01;
public class Cookie {
public Cookie(){
System.out.println("Cookie constructor");
}
void bite(){
System.out.println("bite");
}
}
子类代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package 02;
import 01.Cookie; // 导入父类所在的包
public class ChocolateChip extends Cookie{
public ChocolateChip(){
System.out.println("ChocolateChip constructor");
}
public void chomp(){
bite();
}
public static void main(String[] args) {
ChocolateChip x = new ChocolateChip();
x.chomp();
}
}
错误信息:1
2
3Error:(9, 9) java: 找不到符号
符号: 方法 bite()
位置: 类 com.demo.xliu294.ChocolateChip
假设我们现在希望子类可以继承来自另外一个包的父类中的方法,可以将父类中的该方法设置为public或者protected,但是如果把它指定为public的话,所有的人都有了访问权限,这样是不合适的。但是如果改成protected的话,子类中的bite()就可以访问了。
总结
如果创建了一个新包,并自另一个包中继承类,那么唯一可以访问的成员就是源包中的public成员。(当然,如果在同一个包内执行继承工作,就可以操纵所有的拥有包访问权限的成员。)有时,基类的创建者会希望有某个特定成员,把对它的访问权限赋予派生类而不是所有类。这就需要protected来完成这一工作。protected也提供包访问权限,也就是说,相同包内的其他类可以访问protected元素。
参考
《Java编程思想》