类和接口 - 13,14,15,16节
2017-07-09 13:43
302 查看
知识点:
1.使类和成员的可访问性最小化。
2.在公有类中使用访问方法。
3.使可变性最小化。
4.复合优先于继承。
[b]1.使类和成员的可访问性最小化。[/b]
我们先看一下顶层的类和接口的访问级别:
a.包级私有(默认访问级别): 以为着这个类,只能在他所在包里面访问,包外是不能访问的。是这个包实现的一部分,而不是导出包API的一部分。
b.公有(public): 这个类,在任何地方都可以访问,是这个包导出API的一部分。
我们再来看一下类成员(域,方法,嵌套类,嵌套接口)的访问级别。
a.私有的(private):只有顶层类内部才能访问。
b.包级私有(默认级别):得到这个类对象的引用后,通过引用,只能在类所在包访问。
c.受保护的(protected):类所在的包可以访问,子类也可以访问。
d.公有的(public) :在任何地方都可以访问。
需要注意的地方:
a.访问级别从default变为protected的时候要多加注意,因为变成受保护级别后,其它人就可以看到你的这变量或者方法,不再仅仅你自己内部使用而已。
b.实例域决不能是公有的,不然别人可以任意操作你的这个实例
c.除了公有静态final域以外,公有域不该包含公有域。
2.在公有类中使用访问方法。
我们不应该在公有类中直接定义公有域,应该提供私有域和公有的访问方法。原因很简单,如果这样这个类就失去了对他域的控制,你不能限制任何人使用这个域。
另外,如果类是包级私有,或者是私有的嵌套类,暴露也没关系,因为这些类是你自己内部使用,别人没法使用。
3.使可变性最小化。
怎么是类称为不可变,这里不做描述。你们可以看书,或者看我的文章【设计模式 - 不可变模式】。如果类不能完全的不可变,我们也应该限制他的可变性。
不可变的好处:
a. 不可变对象简单,维护起来很方便。
b. 不可变对象是线程安全的,不需要同步。
c. 不可变对象可以自由的共享。
d. 不可变对象可以作为Map,Set的key。
不可变的缺点:
不同的值都需要一个单独的对象,对象太多,影响效率。
4.复合优先于继承。
这里不做过多描述,我简单说几点,关于适配器模式,我们在设计模式部分,详细讲解:
a.继承是实现代码重用的有力手段,在同一个包类,继承我觉得问题不大。比如你在自己的项目代码中用继承,完全没问题。
b.如果你想要跨包继承的时候,你需要问一下自己,复合是不是更合适。比如你引用了第三方的一个包的一个类,继承这个类会使你的程序依赖第三方的类。如果它发生改变,你是没办法控制的。实际上破坏了封装性,你不是通过API来使用第三方的包。
c.挎包继承的时候,用复合来代替,复合使用API来沟通其它的包,不会破坏程序的封装性。
1.使类和成员的可访问性最小化。
2.在公有类中使用访问方法。
3.使可变性最小化。
4.复合优先于继承。
[b]1.使类和成员的可访问性最小化。[/b]
我们先看一下顶层的类和接口的访问级别:
a.包级私有(默认访问级别): 以为着这个类,只能在他所在包里面访问,包外是不能访问的。是这个包实现的一部分,而不是导出包API的一部分。
b.公有(public): 这个类,在任何地方都可以访问,是这个包导出API的一部分。
我们再来看一下类成员(域,方法,嵌套类,嵌套接口)的访问级别。
a.私有的(private):只有顶层类内部才能访问。
b.包级私有(默认级别):得到这个类对象的引用后,通过引用,只能在类所在包访问。
c.受保护的(protected):类所在的包可以访问,子类也可以访问。
d.公有的(public) :在任何地方都可以访问。
需要注意的地方:
a.访问级别从default变为protected的时候要多加注意,因为变成受保护级别后,其它人就可以看到你的这变量或者方法,不再仅仅你自己内部使用而已。
b.实例域决不能是公有的,不然别人可以任意操作你的这个实例
c.除了公有静态final域以外,公有域不该包含公有域。
2.在公有类中使用访问方法。
我们不应该在公有类中直接定义公有域,应该提供私有域和公有的访问方法。原因很简单,如果这样这个类就失去了对他域的控制,你不能限制任何人使用这个域。
另外,如果类是包级私有,或者是私有的嵌套类,暴露也没关系,因为这些类是你自己内部使用,别人没法使用。
3.使可变性最小化。
怎么是类称为不可变,这里不做描述。你们可以看书,或者看我的文章【设计模式 - 不可变模式】。如果类不能完全的不可变,我们也应该限制他的可变性。
不可变的好处:
a. 不可变对象简单,维护起来很方便。
b. 不可变对象是线程安全的,不需要同步。
c. 不可变对象可以自由的共享。
d. 不可变对象可以作为Map,Set的key。
不可变的缺点:
不同的值都需要一个单独的对象,对象太多,影响效率。
4.复合优先于继承。
这里不做过多描述,我简单说几点,关于适配器模式,我们在设计模式部分,详细讲解:
a.继承是实现代码重用的有力手段,在同一个包类,继承我觉得问题不大。比如你在自己的项目代码中用继承,完全没问题。
b.如果你想要跨包继承的时候,你需要问一下自己,复合是不是更合适。比如你引用了第三方的一个包的一个类,继承这个类会使你的程序依赖第三方的类。如果它发生改变,你是没办法控制的。实际上破坏了封装性,你不是通过API来使用第三方的包。
c.挎包继承的时候,用复合来代替,复合使用API来沟通其它的包,不会破坏程序的封装性。
相关文章推荐
- STM32L PC13当IO口使用驱动LED,PC14,PC15外接晶振,且RTC正常...
- Linux Mint 的国内软件源(支持 Linux Mint 13/14/15)
- 常见python错误(4,5,13,14,15,17点不错)
- STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置
- 13-14-15-16-面向对象、继承、封装、struct和class
- STM32的PC13、PC14、PC15用作普通IO口设置方法
- Jquery李炎恢——47,48,49验证插件【13】【14】【15】
- Fedora 13,14,15安装LAMP(Linux+Apache2+Mysql+PHP)
- java 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,
- STM32C8T6 JTAG使用到PB3|PB4|PA13|PA14|PB15端口做普通IO时,需禁止JTAG!
- (13)递增递减运算符 (14)字符串运算符 (15)赋值运算符 (16)switch case语句
- STM32C8T6 JTAG使用到PB3|PB4|PA13|PA14|PB15端口做普通IO时,需禁止JTAG!
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8
- |1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20所有这些字符串,把它的数字一个个剥离??
- 《构建之法》13,14,15,16,17章读后感
- struts2_day04_13_struts2常用的标签_14_struts2表单标签(一)_15_struts2表单标签(二)
- 《构建之法》13,14,15,16,17章读后感
- Review_2012_11_13_11_14_11_15_11_16
- STM32把PC13、PC14、PC15、PB3、PB4、PA15作为普通IO使用
- IDEA13,14,15,16 新建 branch