美文网首页Java学习笔记Java学习笔记
读书笔记 | 《Think in Java》Ⅵ 访问权限控制

读书笔记 | 《Think in Java》Ⅵ 访问权限控制

作者: 寒食君 | 来源:发表于2018-04-12 20:49 被阅读3次
信仰牌咖啡

Ⅵ 访问权限控制

6.1包:库单元
  • 一个.java文件被认为是一个编译单元,一个编译单元内只能有一个public类,并且此类必须和文件名相同(包括大小写)。若这个编译单元内有其他类,那么包的外部世界是无法看见这些类的。这些类为编译单元内的public类提供支持。

  • 当编译.java文件时,会输出.class文件,每个类都会被编译为.class(包括非public类)

  • Java没有C语言的条件编译功能,该功能是作为一个开关,来编译不同的代码来产生不同的行为。这项功能往往用于C语言跨平台上,这对于Java而言,是没有必要的,因为Java在设计阶段已经解决了这一问题。
    条件编译还有一些其他家价值的用途,比如调试。

6.2 Java访问权限修饰词
  1. 包访问权限:
  • 这是默认权限,没有任何关键字修饰。意味着当前包中的所有其他类对这个成员都有权访问;对于包之外来说,这个成员相当于被private修饰。
  1. public权限:
  • 公有权限,这对于每个人都是开放的。
  • 举个栗子:
//:access/food/Chicken.java
public class Chicken {
    public Chicken(){
        System.out.println("构造一只鸡");
    }
    //没有修饰符默认包访问权限
    void eat(){
        System.out.println("吃");
    }
    
    //公有权限
    public void get(){
        System.out.println("获得");
    }
}

//:access/Dinner.java
public class Dinner {
    public static void main(String[] args){
        Chicken c=new Chicken();
        c.eat();//这句无法访问,因为不在一个包中
        c.get();//可以访问
    }
}
  1. private权限:
  • 私有权限,除了包含改成员的类,其他任何类都无法访问。

  • 默认的包访问权限通常已经提供了充足的隐藏措施。类库的使用者是无法访问带有包权限的成员的。这样的设计很不错,因为默认访问权限应该是一种常用的权限,同时也是为了让类库的设计者在忘记给成员添加权限控制关键字时,能够使成员自动得到一种权限(一般不会出现设计者忘记添加关键字的情况)

  • 这样说来,你可能会认为不需要经常使用private?错了,private的使用非常重要。有一种场景(并非只有这一种),当需要控制如何创建对象,并阻止别人直接访问构造器,可以这样使用。
    举个栗子:

public class Chicken {
    private  Chicken(){}
    static Chicken makeAChicken(){
        return new Chicken();
    }
}

//隐藏了构造器
Chicken c=Chicken.makeAChicken();
  1. protected权限:
  • 继承访问权限。

  • 对于在这个packge外,某些基类的设计者,希望把这个类中的一些成员的访问权限赋予派生类而不是所有类。这就需要使用protected来修饰。对于在这个包内,protected提供默认的包访问权限。

  • 举个栗子:

//:access/food/Chicken.java
public class Chicken {
    public Chicken(){
        System.out.println("构造一只鸡");
    }
    //继承访问权限
    protected void eat(){
        System.out.println("吃");
    }
    

//:access/FriedChicken.java
public class FriedChicken extends Chicken {
  public FriedChicken(){}
  public void chomp(){
    eat();
  }
}

//:access/Dinner.java
public class Dinner {
    public static void main(String[] args){
        FriedChicken fc=new FriedChicken();
        fc.chomp();
    }
}

6.4 类的访问权限
  • 类不可以是private(因为这样会使其他任何类都访问不到它),也不可以是protected的。(一个内部类可以是privateprotected,但这是特例)。对于类的访问权限,只有public和默认访问权限。

  • 假如一个类是包访问权限,这意味着该类的对象可以由包内的任何其他类来创建。但是需要注意的是,若这个类的某个static成员是public的话,包外还是可以调取这个static成员。

6.5 总结

设计访问控制权限有两个原因。

  • 第一是为了使类库的使用者(客户端程序员)不要去触碰那些他们不该触碰的部分。这对于客户端程序员而言是一种服务,同时也可以看到对他们来说,什么是重要的,什么是可以忽略的。(这个概念最早的两章中提过)

  • 第二个原因,是为了让类库的设计者可以修改优化类的内部工作方式,而不用担心这会对类库的使用者带来影响。

需要注意的是,访问权限控制专注于类库的创建者和类库的使用者(客户端程序员)之间的关系,这种关系是一种通信方式。

但是,在一些情况下并非如此。假如你在一个组内和大家一起工作,所有的东西都放在一个包内,这种情况是另一种不同的通信方式,因此严格遵循访问权限规则不一定是最佳选择,默认包访问权限也许仅仅只是可行。(这点暂时还不是很理解)

扫一扫,关注公众号

小白的成长探索之路。

相关文章

网友评论

    本文标题:读书笔记 | 《Think in Java》Ⅵ 访问权限控制

    本文链接:https://www.haomeiwen.com/subject/ilwnhftx.html