🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### [protected: 继承访问权限](https://lingcoder.gitee.io/onjava8/#/book/07-Implementation-Hiding?id=protected-%e7%bb%a7%e6%89%bf%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90) 要理解**protected**的访问权限,我们在内容上需要作一点跳跃。首先,在介绍本书"复用"章节前,你不必真正理解本节的内容。但为了内容的完整性,这里作了简要介绍,举了个使用**protected**的例子。 关键字**protected**处理的是继承的概念,通过继承可以利用一个现有的类——我们称之为基类,然后添加新成员到现有类中而不必碰现有类。我们还可以改变类的现有成员的行为。为了从一个类中继承,需要声明新类 extends 一个现有类,像这样: ~~~ class Foo extends Bar {} ~~~ 类定义的其他部分看起来是一样的。 如果你创建了一个新包,并从另一个包继承类,那么唯一能访问的就是被继承类的**public**成员。(如果在同一个包中继承,就可以操作所有的包访问权限的成员。)有时,基类的创建者会希望某个特定成员能被继承类访问,但不能被其他类访问。这时就需要使用**protected**。**protected**也提供包访问权限,也就是说,相同包内的其他类可以访问**protected**元素。 回顾下先前的文件**Cookie.java**,下面的类不能调用包访问权限的方法`bite()`: ~~~ // hiding/ChocolateChip.java // Can't use package-access member from another package import hiding.dessert.*; public class ChocolateChip extends Cookie { public ChocolateChip() { System.out.println("ChocolateChip constructor"); } public void chomp() { //- bite(); // Can't access bite } public static void main(String[] args) { ChocolateChip x = new ChocolateChip(); x.chomp(); } } ~~~ 输出: ~~~ Cookie constructor ChocolateChip constructor ~~~ 如果类**Cookie**中存在一个方法`bite()`,那么它的任何子类中都存在`bite()`方法。但是因为`bite()`具有包访问权限并且位于另一个包中,所以我们在这个包中无法使用它。你可以把它声明为**public**,但这样一来每个人都能访问它,这可能也不是你想要的。如果你将**Cookie**改成如下这样: ~~~ // hiding/cookie2/Cookie.java package hiding.cookie2; public class Cookie { public Cookie() { System.out.println("Cookie constructor"); } protected void bite() { System.out.println("bite"); } } ~~~ 这样,`bite()`对于所有继承**Cookie**的类,都是可访问的: ~~~ // hiding/ChocolateChip2.java import hiding.cookie2.*; public class ChocolateChip2 extends Cookie { public ChocoalteChip2() { System.out.println("ChocolateChip2 constructor"); } public void chomp() { bite(); // Protected method } public static void main(String[] args) { ChocolateChip2 x = new ChocolateChip2(); x.chomp(); } } ~~~ 输出: ~~~ Cookie constructor ChocolateChip2 constructor bite ~~~ 尽管`bite()`也具有包访问权限,但它不是**public**的。