首页 > 学院 > 开发设计 > 正文

protected:“友好的一种”

2019-11-18 13:21:14
字体:
来源:转载
供稿:网友

  PRotected(受到保护的)访问指示符要求大家提前有所熟悉。首先应注重这样一个事实:为继续学习本书一直到继续那一章之前的内容,并不一定需要先理解本小节的内容。但为了保持内容的完整,这儿仍然要对此进行简要说明,并提供相关的例子。
  
  protected要害字为我们引入了一种名为“继续”的概念,它以现有的类为基础,并在其中加入新的成员,同时不会对现有的类产生影响——我们将这种现有的类称为“基础类”或者“基本类”(Base Class)。亦可改变那个类现有成员的行为。对于从一个现有类的继续,我们说自己的新类“扩展”(extends)了那个现有的类。如下所示:
  
  class Foo extends Bar {
  
  类定义剩余的部分看起来是完全相同的。
  
  若新建一个包,并从另一个包内的某个类里继续,则唯一能够访问的成员就是原来那个包的public成员。当然,假如在相同的包里进行继续,那么继续获得的包能够访问所有“友好”的成员。有些时候,基础类的创建者喜欢提供一个非凡的成员,并答应访问衍生类。这正是protected的工作。若往回引用5.2.2小节“public:接口访问”的那个Cookie.java文件,则下面这个类就不能访问“友好”的成员:
  
  //: ChocolateChip.java
  // Can't access friendly member
  // in another class
  import c05.dessert.*;
  
  public class ChocolateChip extends Cookie {
   public ChocolateChip() {
    System.out.println(
     "ChocolateChip constrUCtor");
   }
   public static void main(String[] args) {
    ChocolateChip x = new ChocolateChip();
    //! x.foo(); // Can't access foo
   }
  } ///:~
  
  对于继续,值得注重的一件有趣的事情是倘若方法foo()存在于类Cookie中,那么它也会存在于从Cookie继续的所有类中。但由于foo()在外部的包里是“友好”的,所以我们不能使用它。当然,亦可将其变成public。但这样一来,由于所有人都能自由访问它,所以可能并非我们所希望的局面。若象下面这样修改类Cookie:
  
  
  public class Cookie {
   public Cookie() {
    System.out.println("Cookie constructor");
   }
   protected void foo() {
    System.out.println("foo");
   }
  }
  
  那么仍然能在包dessert里“友好”地访问foo(),但从Cookie继续的其他东西亦可自由地访问它。然而,它并非公共的(public)。

上一篇:确保正确的清除

下一篇:必须执行清除

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表