java复用类的方式
- 组合
- 继承
组合和继承的选择
- 组合只是复用了现有程序代码的功能,而非它的形式。继承按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。
- 组合技术通常用于想在新类中使用现有类的功能而非它的接口。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口。为了取得此效果,需要在新类中嵌入一个现有的类的private对象。有些情况需要成员对象是public的,根据实际情况来,绝大多数时候成员对象都应该是private的。
- 组合,新类和现有的类是一种“has-a”的关系;继承,新类和现有类是一种“is-a”的关系。
- 向上转型是继承中的一个技术,继承允许子类引用转成父类引用,而且是直接转换的,不像向下转型需要强制转换;也就是说,继承允许子类对象既可以当子类类型来用,也可以当父类类型来用。
好了,我们总结一下,在实际开发过程中,组合和继承技术到底该怎么选择?
如果,我们知道新类和现有类一种“is-a”的关系,是想用现有类的接口而不是功能,而且,在使用过程中是向上转型的,也就是说用父类类型引用使用对象的,那么我们就采用继承技术。其它情况都应该使用组合技术,按照《Think in java》作者的说法,要优先考虑使用组合,慎用继承。
更好的方式是首先选择“组合”,尤其是不能十分确定应该使用哪一种方式时。组合不会强制我们的程序设计进入继承的层次结构中。而且,组合更加灵活,因为它可以动态选择类型;相反,继承在编译时就需要知道确切类型。
到底是该用组合还是用继承,一个最清晰的判断方法就是问一问自己是否需要从新类向基类进行向上转型。 其实向上转型就是忽略具体类型,而是使用接口。
初始化及类的加载
类的加载
一般来说,可以说“类的代码在初次使用时才加载。”这通常是指加载发生于创建类的第一个对象之时,但是当访问static域或者static方法时,也会发生加载。
构造器也是static方法,尽管static关键字并没有显式地写出来。因此更准确地讲,类是在其任何static成员被访问时加载的。
初次使用之处也是static初始化发生之处。所有的static对象和static代码段都会在加载时依程序中的顺序而依次初始化。当然,定义的static的东西只会被初始化一次。
在类的加载过程中,发现有父类先加载父类,以此类推,一直到Object类的加载。
java语言是需要时才加载类,所以在使用时数据都是对的,而C++是一次性都加载进来,所以加载和初始化过程就被小心处理。
初始化
这部分内容看实例化一个对象的过程