在Java中,接口和抽象是两种常见的抽象类型。它们都可以用来定义一些规范或者协议,让其它类来实现或继承,以达到代码复用的目的。
接口是一种纯粹的抽象类型,它只定义了一些方法的签名,没有任何实现体。下面是一个例子:
public interface Drawable { void draw(); }
在上面的例子中,我们定义了一个Drawable接口,它只有一个方法draw(),没有实现。其它类如果想要实现Drawable接口,就必须要实现draw()方法,否则编译会报错。
抽象则是在一定程度上已经实现了,但仍然不是完整的类。我们通常会将一些通用的实现放到抽象类里面,让子类来继承并覆盖其中的一些实现。下面是一个例子:
public abstract class Shape { protected int x; protected int y; public Shape(int x, int y) { this.x = x; this.y = y; } public abstract void draw(); }
在上面的例子中,我们定义了一个Shape抽象类,它包含了x和y两个成员变量,以及一个构造函数和一个抽象方法draw()。Shape抽象类中并没有实现draw()方法,因为每个Shape的子类都有可能有自己的绘制方式,所以由子类来实现这个方法。