lmstack

导航

初读"Thinking in Java"读书笔记之第七章 --- 复用类

  1. 组合语法
    • 将对象引用置于新类中,即形成类的组合。
    • 引用初始化方法
      • 在定义处初始化。
      • 在类的构造器中初始化。
      • 在使用这些对象之前,进行"惰性初始化"。
      • 使用实例初始化。
  2. 继承语法
    • Java中所有的类都是在继承,如果没有明确指出继承的类,则就从根类Object中继承。
    • 每个类中都可以有main方法,可以方便单元测试。
    • 即使一个类只具有包访问权限,其public main()仍然是可以访问的。
    • 继承是对类的复用,可以获得所继承的类中的非私有的方法。
    • 采用super关键字可以访问父类(超类)中的方法。
    • 导出类的构造方法中第一句语句必须是调用基类的构造方法。
    • 当创建一个导出类的对象时,该对象包含了一个基类的子对象(没有创建基类对象)。
    • 导出类对象创建之前,基类的构造器会先执行;如果导出类没有显式的构造器,则编译器会默认调用基类的构造器。
  3. 代理
    • 是继承与组合的中庸之道。
    • 继承会将基类的所有方法都在导出类中暴露,而代理可以实现仅仅将方法的子集在导出类中暴露。
  4. 结合使用组合和继承
    • 导出类中可以重载基类中的方法,也可以覆盖基类中重载的方法。
  5. 在组合与继承之间选择
    • 组合和继承都允许在新的类中放置子对象,组合是显式这样做,继承是隐式地做。
    • 组合通常用于在新类中使用现有类的功能,而非它的接口。新类的用户只能看到新类的接口,而看不到嵌入对象的接口。
    • 继承通常意味着在使用一个通用类,并为了某种特殊需要而将其特殊化。
  6. protected关键字
    • 提供了继承类及包内访问权限。
    • 当希望实现过程对用户隐藏,而对于类继承者开放的时候,可以使用protected。
  7. 向上转型
    • 子类向父类的转型称为向上转型。向上转型不需要强制转换。
    • 向上转型是安全的,因为子类是父类的超集合,含有更多的方法,因此转型过程中唯一可能发生的问题是方法不存在。
    • 要谨慎使用继承技术,在使用时,如果必须向上转型,则继承是必要的。
  8. final关键字
    • final数据
      • 表示常量,在编译时即可参与运算,java中的常量必须是基本数据类型。
      • 一个即是static又是final的数据只占据一段不能改变的存储空间,通常用全部大写加下划线的方式命名。
      • final如果指向引用,则引用的指向是无法改变的,但是所指向的对象自身是可以改变的。
      • 非static的final常量,在每次创建对象时都会初始化一次,然后不可改变;static的final常量,在初次类加载时初始化一次,以后再创建对象时将不会再初始化。
      • 可以使用空白final,在定义时不初始化,而在构造方法中初始化。
      • final也可以用在参数列表中,这意味着无法在方法中更改参数引用所指向的对象,主要用来向匿名内部类传递数据。
    • final方法
      • 锁定方法,以防任何继承类修改其含义。
      • private方法默认隐含了final关键字。当采用向上转型方式访问基类中的private方法时,将会报错。private方法不是类的接口,因此除了对该类而言,其余类都是不可见的。
    • final类
      • final修饰的类,不能被继承,不能被改动。
      • final类中数据可以不是final,因此可以被修改。而final类中的方法都被隐含修饰为final,不能被覆盖。
  9. 初始化及类的加载
    • Java中每个类的编译代码都存在于独立的文件中,只有在需要使用时才会被加载。
    • 类的代码在初次使用时才加载,加载类的动作仅发生一次
      • 加载发生于创建类的第一个对象时
      • 加载发生于访问static域活static方法时。
      • 加载时,所有的static对象和static代码段都会依程序中的顺序初始化。当然static的东西只会被初始化一次。
    • 继承与初始化
      • 当加载一个导出类时,会从其根类一直到该导出类加载static变量,但是并不会创建基类对象,即不会执行基类的构造方法。
      • 类加载完毕后,对象就可以被创建了。首先对象中的所有基本类型及引用类型都被默认初始化。然后从基类到导出类执行构造方法。
  10. 总结
    • 继承和组合都能从现有类型生成新类型。组合是复用现有类型的功能,继承是复用现有类型的接口。
    • 开始一个设计时,一般优先选择使用组合,只在确实必要时使用继承。

posted on 2018-01-14 15:44  lmstack  阅读(92)  评论(0编辑  收藏  举报