接口继承
接口继承(inheritance)与类继承很类似,就是以被继承的 interface
为基础,增添新增的接口方法原型。比如,我们以 Cup
作为原 interface
,在继承 Cup
的基础上,定义一个新的有刻度的杯子的接口 MetricCup
:
interface Cup
{
void addWater(int w);
void drinkWater(int w);
}
interface MetricCup extends Cup
{
int WaterContent();
}
继承后的 MetricCup
增添了一个新的方法原型 WaterContent()
,这个方法返回一个整数(水量)。
interface 的多重继承
在 Java 类的继承中,一个衍生类只能有一个基类。也就是说,一个类不能同时继承多于一个的类。在 Java 中,interface
可以同时继承多于一个 interface
,这叫做 多重继承(multiple inheritance)。
我们创建一个 MusicCup
的接口。它既有 Cup
接口,又有 Player
接口,并增加一个 display()
方法原型:
interface Cup
{
void addWater(int w);
void drinkWater(int w);
}
interface Player
{
void play();
}
interface MusicCup extends Cup, Player
{
void display();
}
如何使用 interface
,见实施接口一章。
抽象类
在生活中,我们会有一些很抽象的概念。这些抽象的概念往往是许多类的集合,比如:
- 粮食 (可以是玉米、小麦、大米)
- 图形 (可以是三角形、圆形、正方形)
再比如,我们之前举出了例子:人类 (可以是男人、女人)
在组织这样的关系时,我们可以使用继承,比如:
根据我们的常识:
Food 类的对象的说法是抽象的。这样一个对象应该是属于 Corn, Rice, Wheat 子类中的一个,世界上不存在一种叫 Food 的食物。
Food 类有 eat()
方法(食物可以吃)。然而,这样的一个动作是抽象的。粮食的具体吃法是不同的。比如 Corn 需要剥皮吃,Wheat 要磨成面粉吃。我们需要在每个子类中覆盖 Food 类的 eat()
方法。
Java 中提供了 抽象类(abstract class)的语法,用于说明类及其方法的抽象性。用关键字 abstract
来表示:
abstract class Food
{
// 抽象方法
public abstract void eat();
public void happyFood();
{
System.out.println("Good! Eat Me!");
}
}
类中的方法可以声明为 abstract
,比如上面的 eat()
。这时,我们不需要具体定义方法,只需要提供该方法的原型。这与接口类似。当我们在比如 Corn 类中继承该类时,才需要提供 eat()
方法的具体定义。
类中的另一个方法 happyFood()
并不是抽象方法。
当一个类中出现 abstract
方法时,这个类的声明必须加上 abstract
关键字,否则 Java 将报错。一个 abstract
类不能用于创建对象。
抽象类的继承
我们可以像继承类那样继承一个抽象类。我们必须用完整的方法定义,来覆盖抽象类中的抽象方法,否则,衍生类依然是一个抽象类。
抽象类的定义中可以有数据成员。数据成员的继承与正常类的继承相同。
abstract class Food
{
public abstract void eat();
public void happyFood()
{
System.out.println("Good! Eat Me!");
}
}
class Corn extends Food
{
// 覆盖抽象的 eat() 方法
public void eat()
{
System.out.println("eat corn");
}
}
public class Test
{
public static void main(String[] args)
{
Corn aCorn = new Corn();
aCorn.eat();
aCorn.happyFood();
}
}
输出结果:
eat corn
Good! Eat Me!
网友评论