抽象类与接口
一、抽象类
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回忆课上的内容,继承树中越往上的类越抽象,例如猫继承动物。在多态中,并不需要将父类初始化为对象,我们需要的只是子类对象,故在JAVA中抽象类不可以实例化对象。
使用abstract关键字定义类称为抽象类,使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承没有任何意义。定义抽象类的语法如下:
public abstract class Animal{
public abstract void eat(); //定义抽象方法
}
接下来我们以下面代码为例进行讲解:
public abstract class Animal{ //定义一个动物类
public abstract void eat(); //给一个抽象的方法,没有方法体
}
public class Cat extends Animal{//继承动物类的小猫类
public void eat(){ //继承父类的eat方法并且有方法体,此时如果没有方法体,程序将会报错
System.out.println("小猫吃鱼!");
}
}
public class Dog extends Animal {//继承动物类的小狗类
public void eat() {
System.out.println("小狗吃骨头!");
}
}
public class Test { //定义一个操作类写main方法
public static void main(String[] args) {
Animal a = new Cat(); //利用多态相关知识直接使用eat方法
}
}
二、接口
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。对于在上述抽象类中遗留的问题,可以将eat()方法封装到一个接口中,使需要eat()方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。在下图中,描述了各个子类继承图形类后使用接口的关系。接口使用interface 关键字进行定义,其语法如下:
public interface class Animal{
void eat(); //定义接口方法可省略public abstract关键字
}