thinking in java学习记录(七)复用类

7.1组合语法

只需要在新的类中产生现有类的对象

编译器并不会对每个引用都创建默认对象,这一点是很有意义的,因为若要使真的那样做的话,就会在许多情况下增加不必要的负担。可以在代码中的这些位置进行:
1.在定义对象的地方,这意味着他们将在构造器调用之前执行。
2.在类的构造器中
3.就在正要使用这些对象之前(惰性初始化),可以减少额外的负担
4.实例初始化

7.2继承语法

可以为每个类都设置一个main方法当做测试

7.2.1初始化基类
可以在构造器中调用基类构造器来保证执行了基类的初始化。但java会自动在导出类的构造器中插入对基类构造器的调用。但若有多个构造器,就要显示的指明到底要调用哪个。

7.3代理

这是基于继承和组合的中庸之道,因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们暴露了该成员对象的所有方法(就像继承)

7.4结合使用组合和继承

7.4.1确保正确清理
finally子句表示的是“无论发生什么事,一定会调用这些方法”
最好的办法是除了内存以外,不能依赖垃圾回收器去做任何事,如果需要清理,最好是编写你自己的清理方法,但不要使用finalize()

7.4.2名称屏蔽

7.5在组合和继承之间选择

组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形
一个很清晰的判断方式就是问一问自己是否需要从新类向基类进行向上转型
7.6protected关键字

7.7向上转型

继承即“新类是现有类的一种类型”,所以可以把子类当做基类来使用

7.7.1为什称为向上转型
历史原因,继承图是基类在上,子类在下

7.8final关键字

7.8.1final数据
1.一个永不改变的常量
2.一个在运行时被初始化的值,但你不希望它被改变

一个既是static又是final的域只能占据一段恒定不变的存储空间(static只会在编译时创建一次,final创建了就不会改变)

当对 对象的引用运用final时,final使引用恒定不变,一旦引用指向了一个对象,就不能指向另外一个对象,但是可以改变对象属性(数组也是对象)

7.8.2final方法
保证行为不变,不会被覆盖(只有这种情形才会使用final方法)

7.8.3final类
不能被继承(final类中的域可以根据自己的意愿设定是否为final)
初始化及类的加载
加载->初始化->运行

每个类的编译代码都存在于它自己的独立文件里,该文件只有需要使用程序代码时才会被加载(可以说类的代码在初次使用时才加载)

类是在其任何static成员被访问时加载的,因为构造器也是static

7.9.1继承与初始化
由于JVM是在static成员被初次访问时加载类,所以初始化顺序优于主方法

优先考虑组合

发布了28 篇原创文章 · 获赞 1 · 访问量 647

猜你喜欢

转载自blog.csdn.net/c630843901/article/details/102492525