第六章 访问权限控制

访问控制(或隐藏具体实现)与 “最初的实现并不恰当” 有关

如何理解:

1.不可能一次性编写出完美的代码  需要反复的修改 重构,这样才能写出更易理解更具维护性的代码

2.我们的代码在被他人使用时,他人希望我们的代码永远不要改动,保持原状最好

综上 所有我们就需要将代码中不变的与变的分离开来   使使用者不必因为创造者的改动而改变代码

解决 约定

开发者承诺不删除 使用者所使用的的任何方法 进行项目升级  

问题:开发者并不知道哪些域(数据成员) 哪些 对象被 使用者所使用 ,如果对这些域,数据成员进行删减或者修改,并不能评估所造成的影响,如果开发者对某个方法的实现也并不满意,如果想要修改或者删除,那将造成更多问题,这就造成 开发者难以迭代代码

限制:访问权限修饰词,用来限制使用者对类的使用,将高度危险的代码隐藏起来 易于后期维护

访问全向依次为:public    protected   包访问权限  private

6.1 包  : 库单元

包内包含有一组类,他们在单一的名字空间只下被组织在一起

不同包内的类无法直接引用,除非使用import进行导入或者将类全名指定

java.util.ArrayList  list = new java.util.ArrayList( )  //看起来是相当的繁琐 会造成代码的臃肿

所以尽量用 import

java的导入机制也名字空间的管理机制,通过对命名空间进行控制为每一个类创建唯一的标识符组合可以避免类名冲突

java  文件  被称为编译单位   每个.java文件中只允许有一个public 类 且类名与文件名一致

这是不行的 但是把 public去掉就没问题了

6.1.1 代码组织

A.java 编译后后生成一个 A.class 文件

package 语句用来 标识类所出的组(包)  必须放在类的最上面(除注释外)

6.1.2 创建独一无二的包名

不介绍了 我直接进入 权限修饰词

6.2 java访问权限修饰词

public  protected  private   使用:置于类中每个成员定义之前 无论是一个域还是一个方法   如果不提供任何权限,就意味着是包访问权限

6.2.1 包访问权限

默认访问权限  同一包内的类才能够访问该修饰词的修饰的 成员或者域,其他包内的类没有权限访问

作用:将包内所有类组织起来 让他们可以彼此访问

类控制着那些代码有权访问自己的成员。其他包内的类不能直接对类中 protected private 以及默认权限下的成员或域进行访问 

访问的唯一途径就是:

1.使该成员成为 public 

2.类中不添加权限修饰词(即使用默认权限修饰词),将访问类放入同一包中,通过包权限来访问

3. 使用继承技术,可以访问到类的public protected 修饰的成员  但不能访问 private修饰的成员 ,另外在同一包内才能访问 包权限修饰成员

4.提供构造器和变异器方法,即getter setter 方法来获取想要访问的成员    get set 的必要性: 可以方便类的创建者任意修改 

限制权限下的成员 包括成员名 成员返回值 成员返的方式   这些修改并不会被使用者所察觉 因为他无需修改代码

private  int k                                                                     

public int getK(){       原来      -------》修改后                  public int getK(){                

     return k;                                                                              return  countK(k);                           

}                                                                                                    // return   i ; 甚至可以返回 其他变量值  

                                                                                                     // return   K2 ;  可以任意修改k的标识符

                                                                                                 }

6.2.2 public:接口访问权限

使用public关键字,意为着public之后声明的成员可以被任何人可用  尤其对客户端程序猿更是如此

6.2.3 private:你无法访问

关键字private 意味着 除了包含该成员的类外,其他任何类都无法访问成员。

private 将自己封闭在类内  允许你随意改变 而不用考虑对其他类的影响 这样很棒对于类的创建者来说很有利

最常见的单例模式 : 类的创建者不希望使用者 自己随意创建对象 将构建器使用private 修饰

6.2.4 protected : 继承访问权限

这里需要注意的是 protected 提供包继承权限  即在同一个包内的类 可以使用 protected修饰的成员变量

继承访问权限 继承可用 

这里需要注意 A包内的类 继承B包中的 类,B包中  基类public 修饰的成员 A中子类是可以使用的,其次就是protected修饰的成员是可使用的  不受包权限的限制

我们来看一个结构:(基类与子类不同包...很少见 基本是要在同一个包中的)

方法在哪个包中被包访问权限限制,对象就只能在那个包内调用它,其他包调用会报错

所以我们要理解protected具有包访问权限 同时包访问权限修饰的方法 到底是正在那个包内 当Nigt在simpletoolbar时,dof()是在该包内使用 才有效,NigtSon继承了Nigt拥有在class内使用该类的权利了,但是由于基类不在A包中,所以NigtSon的对象如果在B包中调用 dof()是不成立的  

6.3 接口和实现

封装:把数据和方法装进类中,以及具体实现的隐藏,共同被称作是封装。 隐藏:访问权限的控制常被称为具体实现的隐藏

封装的结果就是 使我们获得了一个带有特征和行为的数据类型(类)

访问权限控制 将权限控制的边界划在了数据类型(类)的内部 原因在于:

1.设定 客户端程序猿可以使用和不可使用的边界,不用担心客户端程序猿会将数据类型中的内部实现当做接口的一部分进行调用

2.接口与具体实现进行分离  客户端程序猿可以向接口发送消息(调用public 修饰的成员或域)除此之外什么也不能使用,那么对于创建端程序猿来说,实现是可以进行修改有跌代的,而不会破坏客户端程序猿的代码

这里作者介绍了一种类创建方式与阅读方式 权限递减

先把public修饰的成员变量放在上面 之后是 protected  默认权限(包访问权限) private 

当客户端程序猿看到 private时即可停止阅读或者跳跃阅读

6.4 类的访问权限

java 中访问权限修饰词也可用来修饰 class   用来控制客户端程序猿是否可以创建该类的对象

不限制可以使用public 在class前进行修饰

额外限制:

1.每个编译单元都只能有一个public 类。意味着,每个编译单元都有单一的公共接口,用public类来表示。该接口可以按要求包含众多的支持包访问权限的类。

这样

2.public类的名称必须与含有该编译单元的文件名称相匹配,包括大小写

例如这样

3.虽然不常用,但是编译单元(.java文件)中,可以不含public 类,此时类名可以与编译单元文件名不相符,很容易造成别人的混淆

例如这样

类不能使private 或者 protected    只能是public 或者 默认权限修饰(包访问权限修饰)

权限修饰符可以控制对象的创建 但是不能控制 static public 成员的调用

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

推荐阅读更多精彩内容