复用类
组合类
组合语法
组合语法的意思: 在新的类中,是由现有的类组合形成的。
继承: 在现有的类的基础上增添内容。
- 用定义处初始化
- 在构造器中进行初始化
- 在方法中,快使用这个成员变量之前进行初始化操作。
- 用创建实例对象进行初始化。
继承语法
这一内容里面讲述了基本的extends的基本语法, 可是主要字数是去描述, main函数作为类的入口, java 类名的时候会自动运行, 且平时没注意的static 参数对main方法也有效,会变成静态的, 使得即使是包访问限制也是可以进行静态调用的。
- 初始化基类
意思是说,继承后,导出类会包含基类, 基类会被包含在导出类的内部。而你如果用组合的方法进行,也就是基类用new的方式进行, 它则是在导出类的外部-》因为创建对象,是在堆中进行创建, 组合的导出类中,只会用基类的引用。
构建类的过程是从基类向外扩散的,就是说基类先于导出类初始化。所以也就不存在导出类访问基类不存在的问题。
没有默认的基类构造器(基类的无参构造器),因为子类构造器,jvm会自动调用父类的默认基类构造器,如果没有我们就得显式地用super进行调用
代理
代理具有控制性, 代理是中设计模式。而继承地方式, 当有些方法不适合暴露给用户的时候,继承就不太合适了。
组合使用组合和继承
在生命周期内必须清理资源的要求, 常用finally进行必须的清理, 比如关流的时候, 关闭数据库连接的时候
- 名称的屏蔽
是指c++重写的时候会屏蔽父类的方法,这样做的好处是不会在改变实现,而方法签名,和返回值相同的情况下-》重载进行混淆。而Java抛弃这种机制,允许基类的重载,-》 如果重写用override进行覆盖
在组合与继承之间选择
在文中,作者对于组合和继承的选择,源自于,is-a和has-a的判断. 中文去理解就是a是b的一种, has-a则是a是b中众多部分的一部分。 换作数学理解就是, 当a中有B中所需要的很多功能的时候用继承, 反之则用组合。
protected关键字
我们用private进行都细节的封装, 但有些功能需要让子类进行访问就可以用protected, 但相对于子类还是有些方法限制其访问(为了安全), 所以private大多时候还是得相辅相成才行。
向上转型
- 向上转型, 就是某一方法要求参数父类,但可以接受子类的引用, 且在方法中调用父类方法的时候变成调用子类的方法。
从中我们该认识到, 子类对象也是一种父类对象- 向上转型名字的由来:
是由于传统类继承图是将根置于顶端, 然后随着继承关系逐渐向下的。所以将子类的转型成父类称为向上转型。
final关键字
- final常用于:
不希望运行时候被初始化的值,但又不希望客户端程序员对他进行改变。
或者一开始就是一个不用改变的常量
+final加在非基本数据类型的引用前面则会让引用无法指向其他对象, 但这不意味着该引用一成不变,毕竟改变不了引用, 但是我们可以改变对象。
- final在定义的时候不赋值, 但编译器会确保在调用前赋值,不然无法进行编译。这个例子就是:给final修饰的数加随机数, 对象地址不变, 这是一种不变的特性, 但是数值确实改变的。
- final在参数后面加的时候, 你可以读它,使用它但是不能改变它。
- final方法, 又两种好处, 防止继承的子类修改这个方法, 第二种是, 效率问题, 编译器会将调用这个方法的所有调用改变为内嵌调用, 这样速度很快。
private 修饰方法, 那么将不能调用种方法, final修饰方法是为了不能修改, 那么private修饰的方法都不能调用了, 还能修改吗?
初始化及类的加载
- c语言中的加载顺序是:
程序作为启动的一部分立即加载,然后初始化,运行
Java语言中加载是通过类去加载的, 所以只会在第一次创建对象的时候加载
访问顺序是通过判断是否有extends, 因为有, 所以要先递归加载基类,然后再从最上层的基类开始加载static的成员变量进行初始化,初始化由基类到导出类, 类加载完后,对象可以被创建了, 首先所有默认类型被设为默认值,引用被设为null---通过将内存设为二进制0值而一举生成的。然后是调用构造器, 也是从基类开始调用,然后是最后的导出类。
总结
组合是当作底层实现来用, 而继承则是复用基类的接口。
继承可以向上转型为基类, 这对多态至关重要。