引入
我们假设Animal类是一切动物,如:Lion,Hippo,Canine ,Wolf等的基类。
则我们可以写出这样的指令
Wolf aWolf = new Wolf(); // aWolf为对Wolf对象的引用
也可以:
Animal aHippo = new Hippo();
// aHippo为对Hippo对象的引用,aHippo是一个Animal类型的引用变量,因为Animal为Hippo的基类,故这样的方式可行
但是这样会很奇怪:
Animal anim = new Animal(); // Animal对象过于抽象
现在的问题是,我们需要Animal这个对象来继承,但是要限制只有其子类才能被初始化。
所以我们需要抽象类
抽象类
abstract class Canine extends Animal {
public void roam();
}
抽象类无法被初始化
抽象的方法
抽象的方法没有实体
public abstract void eat(); // 没有方法体,直接以分号结束
如果声明出一个抽象的方法,则它所属的类也必须被标记为抽象的。(抽象类中也可以有非抽象的方法)
抽象的方法必须实现
抽象的方法没有内容,它只是为了标记出多态而存在。但是其子类必须实现所有的抽象方法。比如,若Animal为抽象类,则Canine就必须实现出Animal的所有抽象方法。但若Animal,Canine均为抽象类(Dog为Canine子类),则Canine无需实现Animal的抽象方法,这个工作可直接转交给Dog类。当然,Canine也可以直接实现Animal的抽象方法。
接口
Java不支持多重继承(一个子类有多个基类),这时我们就需要接口。
多重继承的最大的问题就是:若多个基类有同一个方法,则子类调用时不知该调用哪个版本。
但接口可解决这个问题,因为它的方法都被设为抽象的。故子类必须实现它的所有方法,这样就不会混淆了。
接口的定义:
public interface Pet{
public abstract void beFriendly();
public abstract void play(); // 接口的方法都是public abstract故可不声明这两个关键字
}
接口的实现
public class Dog extends Canine implements Pet{
public void beFriendly(){...}
public void play(){...}
public void roam(){...}
public void eat(){...}
}