对于类

对于类,只有public和package-private两种访问级别。

1.对于顶层的类来说,只有包级私有和公有两种可能,区别是包级私有意味着只能在当前包中使用,不会成为导出api的一部分,而公有意味着导出api,你有责任去永远支持它。所以,为了使访问最小化,能包级私有就应该声明为包级私有。

2.对于包级私有类来说,如果只在某一个类中被使用,那么就直接让这个包级私有类成为这个类的嵌套类,这样就能让访问级别再次缩小。

对于成员

成员包括域,方法,嵌套类和嵌套接口

访问级别有私有的,包级私有的,受保护的和公有的四种。

1.实例域绝对不能是公有的,声明实例域是公有的,相当于限制了对储存在这个域中的值进行限制的能力,破坏了封装性。
而静态域 也只有在提供常量的抽象类中,通过公有的静态final域来暴露。
 
2. 设计类时,应当把所有的其他成员都变成私有的。
只有当同一个包中另一个类真正需要访问一个成员的时候,才应该删除private修饰符,把该成员变成包级私有的。
其实这两者都是类的实现的一部分,不会影响到他的api。

3.如果对于公有类的成员,访问级别从包级私有变成保护级别时,要额外小心,因为保护的成员是导出api的一部分,必须得到永久支持。

4.方法覆盖了超类中的一个方法,子类中的访问级别就不允许低于父类的访问级别。这个规则限制了方法的可访问性的能力,保证可以使用超类的地方都可以使用到子类。
这就是为什么实现接口的方法都是public的原因,因为接口的方法默认是public abstact的。

Effective Java之使类和成员的可访问性最小化(十三)相关推荐

  1. 使类和成员的可访问性最小化

    模块之间只能通过api进行通信,也就是通过暴露出来的预先定义好的函数进行通信,一个模块不需要,也不应该知道其他模块的内部工作情况,这个概念叫做信息隐藏,,也叫封装,是软件设计的重要的基本原则之一.之所 ...

  2. 第13条 类与接口——使类和成员的可访问性最小化

    要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.正确使用修饰符对于实现信息隐藏是非常关键的. 第一规则很简单:尽可能地使每个类 ...

  3. 类和接口的使用-类和成员可访问性最小化

    一个良好的程序设计应该是层次清晰,各模块对于外部模块来说,是否只提供了对外的API而隐藏了具体的实现细节,通常对于使用者而言,只需要知道实现功能的API 而无法操作具体实现的过程,这种设计理念被称为信 ...

  4. effective java 读书笔记——类和接口

    上周因为准备考试等一堆原因,没空看书,今天补上一点. 类和接口是java程序设计语言的核心,它们也是java语言的基本抽象单元,java语言提供了很多强大的基本元素,供程序员设计类和接口,这一章讲的是 ...

  5. 理解类级别的访问控制权限——类的成员函数可以访问该类所有对象的私有成员

    无论是java还是c++都提供了三种访问控制权限: public.private.protected 它们提供类级别的访问控制,但是类的成员函数可以访问同一类的所有对象的所有私有成员,例如下面的C++ ...

  6. Java为枚举类创建成员变量_Java学习——枚举类

    Java学习--枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  7. Effective Java之使可变性最小(十五)

    为了使类变成可变类,需要遵循以下原则: 1.不要提供任何修改对象状态的方法. 2.保证类不会被扩展,声明类为final. 3.保证所有的域都是final的. 4.保证所有的域都是私有的. 不可变类的优 ...

  8. C++ 在派生类中使用using声明改变基类成员的可访问性

    通过在类的内部使用using声明语句 , 我们可以将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) .using声明语句中名字的访问权限由该using声明语句之前的访问说明符来决 ...

  9. 类的成员函数可以访问属于该类的任意对象的私有变量

    之前在书上看到成员函数可以访问类的私有变量的时候觉得是废话嘛,如果成员函数都不能访问那私有变量不就变成了花瓶了.然而发现自己还是太naive. 这句话的意思是:在类的作用域内,包含成员函数.静态成员函 ...

最新文章

  1. 一个小灯泡引发大论战:千万粉丝科普up主翻车,伊朗“唐马儒”、李永乐等下场,30万公里导线引百万网友围观...
  2. Apple Music 会员免费领啦!
  3. Spring-AOP @AspectJ切点函数之@within()和@target
  4. 《从0到1学习Flink》—— 介绍Flink中的Stream Windows
  5. android 字体 动画,android 对绘制的文本添加动画
  6. python open函数参数_python open函数的用法笔记
  7. 程序员新年要实现的10个愿望
  8. 论文理解(一)树形lstm
  9. oracle column的设置,SQL*PLUS的命令行——column命令 - [ORACLE]
  10. Python 标准库 —— json
  11. vscode中常用的快捷键
  12. 安信可CA-01首款4G模组以物模型连接阿里云物联网,实现远程控制;
  13. css 文字第二行省略号,第二行的css省略号
  14. 休闲平台,何去何从?(1)
  15. swing hacks_这些firefox hacks和扩展程序增强了您的隐私
  16. mysql按时间查询的优化_mysql按时间查询优化的方法
  17. HDU 4507 吉哥系列故事——恨7不成妻(数位DP)
  18. 手机空间不足?教你2招省5G空间
  19. 详解eNSP中Trunk端口和Access端口收发数据的区别
  20. oracle 11g rac suse,suse linux 11 + 多路径+udev+oracle11g rac

热门文章

  1. INLINE HOOK过驱动保护的理论知识和大概思路
  2. deque与vector的主要区别
  3. 在 Mac 上为 Android 编译 WebRTC
  4. WiFi 热点共享设置
  5. Wi-Fi 6 与 5G 相比哪个更快?
  6. [STL]priority_queue
  7. LiveVideoStack成立5周年生日快乐!一路走来,感谢有你!
  8. 如何给小白解释什么是编解码器
  9. Flutter浪潮下的音视频研发探索
  10. 谁是最好的WebRTC SFU?