你的位置:首页 > Java教程

[Java教程]Thinking in JAVA笔记——第七章 复用类


复用:使用类而不破坏现有代码

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先加载,基类先加载