继承是面向对象编程不可缺少的组成部分,继承语法简单,使用关键字extends来实现继承,示例如下:
package com.shaoshuidashi.how;
class Car{
public void startup(){
System.out.println('startup');
}
public void stop(){
System.out.println('stop');
}
}
//Truck 继承自 Car
class Truck extends Car{
}
public class How{
public static void main(String[] args) {
Truck t = new Truck();
t.startup();
t.stop();
}
}
可以看到Truck类后面添加extends Car以后,Truck就继承了Car类。
为什么要使用继承?上个例子中Truck类继承Car类以后,Truck类对象可以直接调用startup和stop方法,这就是使用继承的原因即代码复用。通常被继承的类称之为父类,继承的类称之为子类,子类继承父类以后,子类可以使用父类的public和protected修饰的数据和方法。但是继承最厉害的地方在于抽象编程,下一篇会详细介绍抽象编程。
Java还有另外一种代码复用的方式,示例如下:
//文件系统驱动类
class FSDriver{
void open(){
}
void close(){
}
void write(String msg){
}
void read(){
}
}
//写日志类,使用FSDriver来实现文件操作
class Log{
private FSDriver driver = new FSDriver();
public void errorLog(String msg){
driver.open();
driver.write(msg);
driver.close();
}
}
//数据库驱动类,使用FSDriver来实现文件操作
class DBDrvier{
private FSDriver driver = new FSDriver();
public void connect(){
driver.open();
}
public void close(){
driver.close();
}
}
上面的例子中DBDrvier和Log类通过持有一个FSDriver 对象来实现对FSDriver功能的复用,这种复用方式称之为组合。
什么时候使用继承什么时候使用组合?从复用性考虑应该优先使用组合,继承往往更适用于抽象编程。使用组合复用代码使代码更易于阅读,因为组合对象的方法调用形式总是obj.method()的形式,代码维护者可以直观的看到调用了obj的method方法。而继承调用方法的形式为method(),method方法有可能是类自身的,也有可能是父类的或爷爷类的,有一个寻找实现的过程,比使用组合要稍微费劲一些。使用组合复用代码的另一个强有力的理由是:组合可以在运行时动态修改对象引用,当然引用对象需要能向上转型,关于向上转型将在下一篇中介绍,从这点来说使用组合复用代码更具灵活性。