抽象类和抽象方法
抽象方法
在面向对象编程语言中抽象方法指一些只有方法声明而没有具体方法体的方法抽象方法一般存在于抽象类或接口中。
java中,抽象方法就是以
abstract 修饰的方法,
只需要声明而不需要实现
abstract
void f();
抽象类
包含抽象方法的类叫抽象类。
abstract
class Sample {
private int param1;
abstract void f1();
void f2() {}
}
private int param1;
abstract void f1();
void f2() {}
}
注:
1、如果一个类包含有抽象方法,则必须限定为抽象类,否则编译器会报错。
2、抽象类不能实例化,否则编译器会报错。
接口
什么是接口
java中,接口是以 interface 来修饰的。
接口可以被视为一个比“抽象类”更加抽象的类。
实现接口
一个类遵循某个特定或一组接口,必须使用 implements 关键字。
interface Fly {
void fly();
}
class Bird implements Fly {
@Override
public void fly() {
System.out.println("展翅飞翔");
}
}
void fly();
}
class Bird implements Fly {
@Override
public void fly() {
System.out.println("展翅飞翔");
}
}
注:接口中的方法必须是 public 类型,可以不显示地指定。但是如果指定为其他类型,编译器会报错。
扩展接口
玩过游戏的朋友们,肯定熟悉这个模式。
一名战士需要具备战斗能力。一名骑士不仅需要具备战斗能力,也需要具备骑术。
更进阶的圣骑士则还需要具备法师一般的魔法能力。这个关系可以抽象成以下代码:
interface Warrior {
void fight();
}
interface Knight extends Warrior {
void riding();
}
interface Enchanter {
void magic();
}
// Paladin类实现多个接口,需要包含这些接口的所有方法
class Paladin implements Knight, Enchanter {
public void fight() {}
public void riding() {}
public void magic() {}
}
void fight();
}
interface Knight extends Warrior {
void riding();
}
interface Enchanter {
void magic();
}
// Paladin类实现多个接口,需要包含这些接口的所有方法
class Paladin implements Knight, Enchanter {
public void fight() {}
public void riding() {}
public void magic() {}
}
多重继承
请考虑如下图的情况,一名在职研究生既是职工,也是学生,也是研究生。如果我们要在代码中实现这个继承关系,该如何去做?
C++中支持多重继承,但是JAVA中不支持多重继承,以下方式是错误的。一个类不能扩展多个类。
class Person {};
class Student extends Person {};
class Postgraduate extends Student {};
class Employee extends Person {};
class OnJobPostgraduate extends Postgraduate, Employee {};
class Student extends Person {};
class Postgraduate extends Student {};
class Employee extends Person {};
class OnJobPostgraduate extends Postgraduate, Employee {};
JAVA中虽然不支持多重继承,但是可以通过接口实现类似的行为。一个类可以实现多个接口。
interface Person {};
interface Student extends Person {};
interface Postgraduate extends Student {};
interface Employee extends Person {};
class OnJobPostgraduate implements Postgraduate, Employee {};
interface Student extends Person {};
interface Postgraduate extends Student {};
interface Employee extends Person {};
class OnJobPostgraduate implements Postgraduate, Employee {};