复用:使用类而不破坏现有代码
1.组合:新类中使用现有类对象 has-a
2.继承:按照现有类创建新的类 is-a
7.1 组合语法
直接在类内定义一个对象即可。
*toString:每个类都有toString,编译器如果在需要String的地方遇到一个对象,就会自动执行toString
默认值是Object类里的toString,getClass().getName() + "@" + Integer.toHexString(hashCode()); 类名+hash码?
类内对象初始化:
1.在对象定义出
2.构造器中
3.使用对象前:惰性初始化,可以减少负担
4.使用实例初始化
7.2继承语法
*所有类都隐式继承Object类
*子类自动得到父类的所有域和方法,构造器自动先调用父类的构造器
*子类可以覆盖父类的方法,使用super表示父类的引用?也可以添加新的方法
7.2.1 初始化父类
*在创建子类对象时,该对象包含了一个父类的子对象,包装在子类的内部。子类总是在构造器第一句之前“偷偷”调用父类构造器
*如果父类构造器带参数,则必须用super显示调用,且必须位于构造器第一句!
7.3代理Delegation??
我的理解:使用继承,父类的所有方法都向外部暴露
代理:使用组合,且对象为private,提供public方法,方法内部调用组合对象的方法,这样可以有更多的控制力
7.4结合使用组合和继承
7.4.1确保正确清理
Java没有C++析构函数的概念,如果有必要的清理操作,就必须显式的编写,并确保类使用者知道他们必须调用这一方法。
通常将清理动作放在finally子句中保证一定被执行!
如果必须亲自处理清理动作时,必须多加小心
7.4.2名称屏蔽
Java允许在子类中对父类的方法重载
在覆盖时,可以添加@Override注解,表明是方法覆盖,如果出现重载现象,编译器会报错,避免重载而非覆盖!
7.5在组合与继承之间选择
组合通常是使用已有对象的功能,通常为private仅提供给类内部使用
有时设为public也具有意义,特别是has-a的关系时
继承是is-a,是从抽象到具体的关系!
7.6protected关键字
7.7向上转型
要求父类引用 可以接受子类的引用,以为父类能干的事子类都能干!唯一可能发生的事情就是丢失方法。
7.8final关键字
final通常表示“这是无法改变的”,原因是设计或效率
7.8.1final数据
java常量必须是基本类型。如果是final引用,只能是引用不变,不能保证对象不变!
空白final:在声明时不赋值,在使用前赋值
final参数:在方法中无法改变引用。
7.8.2final方法
原因:禁止子类覆盖
private:隐含语义是禁止覆盖,但实质上private方法对子类是不可见的,所以子类如果有一个父类private方法,其实不是覆盖,而是一个“新”方法!
7.8.3final类
final类不允许有子类!
7.8.4忠告
废话一堆,就是说要谨慎考虑。。。
7.9初始化及类的加载
加载顺序:当运行是,static先加载,基类先加载