天天看点

【Java编程思想笔记】第七章-复用

  • 代码复用可分为组合复用与继承复用。
  • 属性成员初始化的4个时机:定义时、构造器中、块中、使用时。
  • main方法所在的类不一定要是public的(但方法一定要定义成public,如果不是public方法,则启动时会报找不到main方法)为包访问也是可以的,照样可以用作程序入口。另外,main方法也可以由另一个main方法来调用,这也是允许的。
  • 继承并不只是复制基类的接口,当创建了一个子类的对象时,该对象包含了一个基类的子对象,这个子对象与你用基类直接创建的对象是一样的,二者区别在于,后者来自于外部,而基类的子对象被包装在子类对象内部。
  • 当我们亲自处理清理时,要加以小心,因为,一旦涉及垃圾回收,能够信赖的事就不会很多了,垃圾回收器可能永远也无法被调用,即使用被调用,它可能以任何它想要的顺序来回收对象。最好的办法是除了内存以外,不能依赖垃圾回收器去做任何事,如果需要进行清理,最好编写你自己的清理方法,但不要使用finalize(),最好是在finally块调用自己的清理方法。
  • 组合和继承都允许在新的类中放置子对象,组合是显示地这样做,而继承则是隐藏地做。
  • 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口,一般需在新类中嵌入一个现有类的private对象。
  • 向上转型是从一个较专用类型向较通用类型转换,所以总是很安全的。向上转型的过程中,类接口唯一可能发生的事情是丢失方法,而不能访问它们。
  • 到底是该用组合还是用继承,一个最清晰的判断办法就是问一问自己是否需要从新类向基类进行向上转型。如果必须向上转换,则继承是必要的,但如果不需要,则应当好好考虑自己是否需要继承。
  • 使用static与final域只占据一段不能改变的存储空间。
  • final数据在编译时可能还不能确定其值,比如值是通过某个方法计算才能得到的,需在运行时才能确定。
  • 对于编译期常量这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译时执行计算式,这可减轻一些运行时的负担。在Java中,这类常量必须是基本数据类型。
  • 在Java早期实现中,如果将一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用。当编译器发现一个final方法调用命令时,它会跳过插入程序代码这种正常方式而执行方法调用机制,并且以方法体中的实际代码的副本来替代方法调用,这将消除方法调用的开销。当然,如果方法本身很大,这种效率提升不是很明显,反而可能下降。在最近的Java版本中,虚拟机可以探测到这些情况,并优化去掉这些效率反而降低的额外的内嵌调用,因此不再需要使用final方法来进行优化了,事实上,这种做法正在逐渐受到劝阻,在使用JavaSE5/6时,应该让编译器和虚拟机去处理效率问题,只有在想要明确禁止覆盖时,才将方法设置为final。
  • 类中所有的private方法都隐式地指定为final,可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义。
  • final类中定义的属性成员可以是final的,也可以不是的。但是,所有final类的中方法默认都是final的,因此在final类中的方法前添加final修饰符没有什么意义。