Java编程思想(第四版)学习笔记(7)

第六章 访问权限控制


1.访问权限控制的等级
  • 从最大权限到最小权限依次为:public、protected、包访问权限(没有关键字)和private。
2.包:库单元

Java用package关键字将构件捆绑到一个内聚的类库单元中。当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元)。每个编译单元必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看到这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持。

  • package语句必须是文件中除注释以外的第一句程序代码。
  • Java包的命名规则全部使用小写字母,包括中间的字也是如此。

Java解释器的运行过程如下:
The Java interpreter proceeds as follows. First, it finds the environment variable CLASSPATH (set via the operating system, and sometimes by the installation program that installs Java or a Java-based tool on your machine). CLASSPATH contains one or more directories that are used as roots in a search for .class files. Starting at that root, the interpreter will take the package name and replace each dot with a slash to generate a path name off of the CLASSPATH root (so package foo.bar.baz becomes foo\bar\baz or foo/bar/baz or possibly something else, depending on your operating system). This is then concatenated to the various entries in the CLASSPATH. That’s where it looks for the .class file with the name corresponding to the class you’re trying to create. (It also searches some standard directories relative to where the Java interpreter resides.)

3.Java访问权限修饰词

访问权限修饰词可以类中每个成员的定义之前(无论它是一个域还是一个方法)。

包访问权限
  • 默认访问权限没有任何关键字,但是通常是指包访问权限(有时也表示成为friendly)。其意味着当前的包中所有其他类对那个成员都有访问权限,但是对于这个包之外的所有类,这个成员却是private。由于一个编译单元(即一个文件),只能隶属于一个包,所有经由包访问权限,处于同一个编译单元中的所有类彼此之间都是自动可访问的。

取得对某个成员的访问权的唯一途径是:

取得访问权限的方法
取得访问权限的方法

注意:同处于相同的目录但是没有给自己设定任何包名称的Java文件将被看做是隶属于该目录的默认包之中。

All the files within the same directory that don’t have explicit package declarations are implicitly part of the default package for
that directory.

public:接口访问权限

使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人(任何类)都是可用的(可访问的),尤其是使用类库的客户程序员更是如此。

private:你无法访问

关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
注意:使用类的客户端程序员是无法访问包访问权限成员的。
private的运用示例:可能想控制如何创建对象,并阻止别人直接访问某个特定的构造器(或全部构造器)。示例如下:

class Sundae {
  private Sundae() {}
  static Sundae makeASundae() {
    return new Sundae();
  }
}

public class IceCream {
  public static void main(String[] args) {
    //! Sundae x = new Sundae();
    Sundae x = Sundae.makeASundae();
  }
}

上述示例中,不能通过构造器来创建Sundae对象,而必须调用makeASundae()方法来达到此目的。

  • 说明:除非必须公开底层实现细目(此种境况很少),否则就应该将所有的域指定为private。
  • However, just because a reference to an object is private inside a class doesn’t mean that some other object can’t have a public reference to the same object.(如何理解此句话?)
protected:继承访问权限
  • 如果创建了一个新包,并在该新包中创建一个类(子类)继承另一个包中的某个类(基类),那么唯一可以访问基类的成员就是其public成员和protected成员(当然,如果在同一个包内执行继承工作,就可以操纵所有的拥有包访问权限的成员)。
  • protected也提供包访问权限,即相同包内的其他所有类可以访问protected元素。
小结:访问权限示意图
访问权限示意图
4.接口和实现
  • 访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,行共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
  • 为了清楚起见,可能会采用一种将public成员置于开头,后面紧跟protected、包访问权限和private成员的创建类形式。示例如下:
public class OrganizedByAccess {
  public void pub1() { /* ... */ }
  public void pub2() { /* ... */ }
  public void pub3() { /* ... */ }
  private void priv1() { /* ... */ }
  private void priv2() { /* ... */ }
  private void priv3() { /* ... */ }
  private int i;
  // ...
}
5.类的访问权限
  • 为了控制某个类的访问权限,修饰词必须出现于关键字class之前,如,public class Widget{...}
    类的一些限制如下:
    类的限制
    类的限制
  • 类既不可以是private(否则,除该类外,其他任何类都不可以访问它),也不可以是protected的。所以对类的访问权限,仅有两个选择:包访问权限或public。如果不希望其他人对该类用于访问权限,可以把所以的构造器都指定为private,从而阻止任何人创建该类的对象,但是有一个例外,就是你在该类的static成员内部可以创建该类的对象。示例如下:
class Soup1 {
  private Soup1() {}
  // (1) Allow creation via static method:
  public static Soup1 makeSoup() {
    return new Soup1();
  }
}

class Soup2 {
  private Soup2() {}
  // (2) Create a static object and return a reference
  // upon request.(The "Singleton" pattern):
  private static Soup2 ps1 = new Soup2();
  public static Soup2 access() {
    return ps1;
  }
  public void f() {}
}

// Only one public class allowed per file:
public class Lunch {
  void testPrivate() {
    // Can't do this! Private constructor:
    //! Soup1 soup = new Soup1();
  }
  void testStatic() {
    Soup1 soup = Soup1.makeSoup();
  }
  void testSingleton() {
    Soup2.access().f();
  }
}

说明
1)如果想要在返回引用前在Soup1上做一些额外的工作,或是如果想要记录到底创建了多少个Soup1对象(可能与限制其数量),这种做法将会大有裨益的。
2)Soup2用到了单例模式(singleton),这是因为我们始终只能创建它的一个对象。

  • 注意:
    1)如果没有为类访问权限指定一个访问修饰符,它就会默认得到包访问权限。此时,即使将该类的构造器声明为public的,也不能在包外实例化该类。并且,即使该类中拥有static public字段或static public方法,也不能在包外直接通过该类访问。总之,在具有包访问权限的类中,使用public并不能将其修饰的成员或构造器提升到public权限,即使用public无效。

    2)一个类的默认构造器的访问权限和该类的访问权限相同。

    3)内部类可以是private或protected的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方...
    小敏纸阅读 1,436评论 0 19
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 931评论 0 1
  • 1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?...
    QQQQQCY阅读 229评论 0 0