复用代码是java众多引人注目对功能之一,有两种方法:
1.组合:只需在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所有这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它的形式。
2.继承:按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码,这种神奇的方式称为继承,而且编译器可以完成其中大部分工作。继承是面向对象程序设计的基石之一。
继承
继承是所有OOP语言和Java语言不可缺少的组成部分。当创建一个类时,总是在继承,因此,除非已明确指出要从其他类中继承,否则就是在隐式地从java的标准根类Object进行继承。
从外部来看,继承类就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域,但继承并不只是复制基类的接口。
当创建一个导出类(继承类或子类)的对象时,其实是该对象包含了一个基类的子对象super。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。
对基类子对象的初始化,java会自动在导出类的构造器中插入对基类构造器的调用。如果基类不存在默认构造器,则需要在导出类的构造器中手动调用基类构造器。而且,调用基类构造器必须是你在导出类构造器中要做的第一件事。
组合
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象 的接口。为取得此效果,需要在新类中嵌入一个现有类的private对象。
final关键字
- final域
对于基本类型,final使数值恒定不变,而用于对象引用,final是引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,java并未提供使任何对象恒定不变的途径。这一限制同样适用数组,它也是对象。
既是static又是final的域,即编译期常量,将用大写表示,并适用下划线分隔各个单词。 - final参数
java允许在参数表中以声明的方式将参数指明为final。这意味着你无法在方法中更改参数引用所指向的对象。 - final方法
适用final方法的原因有两个,第一个原因是把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑,想要确保在继承类中使方法行为保持不变,并且不会被覆盖。
第二个原因是效率,在java早期实现中,如果将一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用。当编译器发现一个final方法调用命令时,它会根据自己的谨慎判断,跳过插入程序代码这种正常方式而执行方法调用机制(将参数压入栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的实际代码的副本来替代方法调用,这将消除方法调用的开销。
类中所有的private方法都隐式地指定为final的。 - final类
fianl类不允许有子类。
final类的域可以根据个人的意愿选择为是或不是final的。不论类是否被定义为final,相同的规则都适用于定义为fianl的域。然而,由于final类禁止继承,所以final类中的所有方法都隐式指定为final的,因为无法覆盖它们。