一、抽象类
1.1 概念
使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承没有任何意义。定义抽象类的语法如下:
public abstract class Parent{abstract void testAbstract();
}
1.2 性质
①在多态机制中,并不需要将父类初始化为对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化为对象。
②如果声明一个抽象方法,就必须将承载这个抽象方法的类定义为抽象类,不能在非抽象类中获取抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
③抽象类被继承后需要实现其中所有的抽象方法,也就是保证以相同的方法名称、参数列表和返回值类型创建出非抽象方法,当然也可以是抽象方法。
1.3 局限
如图所示,继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。程序中有些不需要draw()方法的子类也不得不重写draw()方法。如果将draw()方法放置在另一个类中,让需要的子类继承,也不妥,因为Java中规定类不能同时继承多个父类。为了应对这种问题,接口的概念便出现了。
二、接口
2.1 概念
接口是抽象类的延申,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。接口使用interface关键字进行定义,其语法如下:
public interface Paintable{void draw(); //定义接口方法可省略public abstract关键字
}
2.2 性质
在接口中定义的任何字段都自动是static和final的。
一个类继承一个父类的同时再实现一个接口,可以写成如下形式:
public class Parallelogram extends Quadrangle implements Paintable {}
Java中不允许出现多重继承,但使用接口就可以实现多重继承。一个类可以同时实现多个接口,因此可以将所有需要继承的接口放置在implements关键字后并使用逗号隔开。实现多个接口的语法如下:
class 类名 implements 接口1,接口2......
但这可能会在一个类中产生庞大的代码量,因为继承一个接口需要实现接口中所有的方法。一个接口可以继承另一个接口,其语法如下:
interface intf1 { }
interface intf2 extends intd1 { }