- 抽象类
用abstract定义,用于抽象出一类物品的公共属性和方法,方法可提供默认的实现。如动物类、车类等等。显然意见,抽象类定义的初衷是为了继承。
子类可以通过extends关键字实现类的继承,与C++不同,Java不能多继承,即:一个类只能有一个父类,所以某些特殊方法就尽量不要放在抽象类中。如动物类(Animal)的捕猎方法(catch)等。 - 接口类
可以认为是一系列方法的集合,类可以通过implements实现接口,在Java中一个类可以实现多个接口。 - 典型应用
我们为门定义一个抽象类Door,并定义抽象方法open和close。现在需定义一个告警门的类AlarmDoor,该门有告警功能(alarm方法)。 AlarmDoor本质上是Door,但同时它也拥有报警的行为功能。此时我们将此应用场合采用如下代码定义,可优雅的实现我们的意图。
abstract class Door
{
abstract void open();
abstract void close();
}
interface Alarm
{
void alarm();
}
class AlarmDoor extends Door implements Alarm
{
void open(){}
void close(){}
void alarm(){}
}
- 应用接口实现回调
假设有下面一个应用场景:有一个农夫,他每天要给牛喂草,牛吃草后产奶给农夫。我们先定义奶牛类Cow,该类中有一个吃草方法(eat),在eat方法中需给农夫增加牛奶(简便起见,吃一个草加一个牛奶)。此时我们在Cow类中定义一个接口,并在类的构造函数中传入接口。然后在eat中调用该接口,实现牛奶的增加。
农夫类Farmer实现增加牛奶接口(IFMilk),并实现接口的方法addMilk。农夫的喂牛方法Feed中,定义Cow对象,并传入this作为IFMilk接口的实例,成功实现回调。
public class Cow
{
public Cow(IF_Milk iMilk)
{
mIFMilk = iMilk;
}
private IF_Milk mIFMilk;
public interface IF_Milk
{
void addMilk(int n);
}
public void eat(int nGrass)
{
mIFMilk.addMilk(nGrass);
}
}
public class Farmer implements Cow.IF_Milk
{
public int myMilk = 0;
protected void Feed(int nGrass)
{
Cow c = new Cow(this);
c.eat(nGrass);
}
public void addMilk(int n)
{
myMilk += n;
}
}