复用代码是Java众多引入注目的功能之一。但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。

1.组合语法

  • 将对象引用置于新类中.
  • 初始化对象引用:1.定义时初始化;2.构造器初始化;3.使用之前(惰性初始化);4.实例初始化(代码块).

2.继承语法

  • 采用extends关键字实现.
  • 采用现有类的类型来创建新类,无需改变现有类的形式.
  • 即使一个类只有包访问权限,其public main仍然是可访问的.
  • 继承并不只是复制基类的接口.当创建了一个当初类的对象时,该对象包含了一个基类的子对象,和直接创建的基类对象是一样的,区别在于,后者来自外部,而基类的子对象被包装在导出类对象内部.
  • 基类初始化:构造器.如果没有,会合成一个默认的构造器,该构造器将调用基类的构造器.
  • 调用带参构造器:super.
  • 调用基类构造器必须是在导出类构造器中要做的第一件事(如果做错了,编译器会提醒).

3.代理

  • Java语言不支持直接代理.
  • 将一个成员的对象置于所要构造的类中(就像组合),但于此同时在新类中暴露了该成员对应的所有方法(就像继承).

4.结合使用组合与继承

  • 确保正确清理:try{}finally,先清理导出类,在清理基类.
  • 如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义个该方法名称并不会屏蔽其在基类中的任何版本.
  • 使用@Override(不是关键字)注解覆盖与基类完全相同的特征签名及返回类型具有相同名称的方法.

5.在组合与继承之间选择

  • 组合和继承都允许在新的类中放置子对象,组合是显示地这样做,而继承则是隐式地做.
  • 组合技术通常用于想在新类中使用现有类的功能而非他的接口这种情形.
  • 在继承的时候,使用某个现有类,并开发一个它的特殊版本.
  • "is-a"(是一个)的关系是用继承来表达的,而"has-a"(有一个)的关系是用组合来表达的.

6.protected关键字

  • 将某些事物尽可能对这个世界隐藏起来,但仍然允许导出类的成员来访问它们.
  • 就类用户而言,这是private的,但对于任何继承与此类的导出类或其他任何位于同一个包内的类来说,它却是可以访问的(protected提供了包内访问权限).

7.向上转型

  • 将根置于页面的顶端,然后逐渐向下.由导出类转型成基类,在继承图上是向上移动的,因此一般称为向上转型(总是安全的).
  • 在向上转型的过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取它们.

8.final关键字

  • 无法改变的(不想改变的理由:设计或效率).
  • final数据:对于基本数据类型,final使数值恒定不变;而对用对象引用,final使引用恒定不变(无法改为指向另一个对象,对象自身可以被修改).
  • static final 域只占据一段不能改变的存储空间,基本用全写大写字母命名.
  • 空白final:声明时为赋值,使用前必须被初始化(提供了更大的灵活性).
  • final参数:无法在方法中更改参数引用所指向的对象(主要用来向匿名内部类传递参数).
  • final方法:把方法锁定,防止任何继承类修改它的含义.
  • 类中所有的private方法都隐式地被制定是final的.
  • 覆盖只有在某方法是基类接口的一部分时才会出现,否则,仅具有相同名称(基类方法设置为private是因为它所归属的类的组织结构的原因).
  • final类:不允许继承(对该类的设计永不需要做任何变动/安全).
  • 不论类是都被定义为final,相同的规则都适用于定义为final的域.
  • final类中所有的方法都隐式指定为师final的.
  • 忠告:慎用final.

9.初始化及类的加载

  • 在许多传统语言中,程序是作为启动过程的一部分立刻被加载的,然后是初始化,紧接着程序开始运行.
  • 类的代码在初次使用时才加载,即加载发生于创建类的第一个对象之时,或者static域或方法被访问时.

END


JadeQYuan
279 声望311 粉丝

知其然,知其所以然。。。