在C++里,如果需要强迫派生类重新实现基类里的虚函数,可以在基类里只声明虚函数,但不实现函数体(即纯虚函数). 当一个类继承基类时就需要实现基类里声明虚函数,否则编译不通过.
class Animal {
public:
virtual void eat() = 0; //没有函数体的虚函数就是纯虚函数了.
};
class Dog : public Animal { //当继承Animal类时,就必须在此类里实现所有Animal里的纯虚函数.
public:
void eat() {
cout << "dog eats" << endl;
}
};
在java里把像C++纯虚函数同样功能的函数叫作抽像函数,而且具有抽像函数的类必须声明为抽像类.
abstract class Animal { //具有抽像函数的类必须声明为抽像类
abstract public void eat();
}
class Dog extends Animal {
public void eat() { //同样的,在此类也里需要实现Animal类里的所有抽像函数,除非此类也声明为抽像类
System.out.println("dog eats");
}
}
public class Hello {
public static void main(String[] args) {
Animal a = new Dog(); //基类指针变量指向派生类对象
a.eat(); //调用Dog的eat()函数
}
}
java里的接口(interface)基实就一个只有只读的属性成员和抽像函数的类, 如:
// Animal接口
interface Animal {
int num = 88;
final int age = 99; // final关键字相当于c++里的const,只读的意思。而且必须有初始值
abstract public void eat();
public void run();
}
//注意属性成员就算不带final关键字,编译器也是当作带了final来处理的.
// 函数声明不带abstract关键字,编译器也是当作带了abstract来处理,因接口里只能有只读的属性成员和抽像函数。
接口可以继承另一个接口来扩展功能, 如:
interface Animal {
int num = 88;
abstract public void eat();
abstract public void run();
}
interface Human extends Animal { //接口Human继承了Animal接口
public void lie();
}
一个类不叫继承接口,叫实现(implements)接口. 而且可以实现多个接口,但只能继承一个类,也就是只能有一个父类.
interface Car {
public void drive();
}
class Dog implements Human, Car { //Dog类实现了Human接口和Car接口
public void eat() {
System.out.println("dog eat");
}
public void run() {
System.out.println("dog run");
}
public void drive() {
System.out.println("dog drive");
}
public void lie() {
System.out.println("dog lie");
}
}
public class Main {
public static void main(String[] args) {
Dog d;
d = new Dog();
d.eat();
d.run();
d.drive();
}
}