问题描述
  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编程思想》