Java中的接口抽象方法与C++中的抽象类纯虚函数
接着我的文章当中C++静态绑定和动态绑定的例子.
一个简单的形状类:
如下:
class Figure{
public:
Figure(){
_name = "Figure";
}
virtual string getName() const{
return _name;
}
virtual double area()const = 0;
private:
string _name;
};
形状表示一种抽象的概念.所以如果是在Java中的话Figure应该定义为一个抽象类.类名前用abstract来修饰.
在C++中,抽象函数不是直接用abstract关键字来指定的.
在C++中包含有纯虚函数的类的被称为抽象类.这个跟Java中抽象方法有相同点.
在C++中定义纯虚函数格式如下:
virtual<返回值类型><函数名>(<形式参数表>)=0;
即纯虚函数的定义是在虚函数定义的基础上,再让函数等于0即可.这只是一种表示纯虚函数的标志.而不是指它的返回值是0.
上面的例子中.对于对一个形状的面积来讲确实是一个无法确定的概念,就好像说
如果调用这个Figure类的求面积方法area()的结果是未定义的一样.
因为只有针对具体的形状如圆,三角形.矩形等才有意义.
与C++的抽象类中纯虚函数最对应的是Java的抽象类中的抽象方法.
在Java中如果一个类中有一个方法是抽象的,那么这个类也就是抽象的.需要用abstract修饰类名.(除非是一个特殊的类型如枚举).
不管是对于 C++还是Java而言,抽象类中抽象方法(C++中的纯虚函数)
Java中方法修饰中的abstract与private,static,final关键字是不互斥的.(道理显然)
显然可见的是,抽象类不能实例化,主要是因为调用抽象类中的抽象方法是没有意义的.
在Java中下面的代码有出现编译错误,原因就是ColoredPoint类中的super关键字试图访问Point类中的抽象toString()方法.
abstract class Point{
int x,y;
public abstract String toString();
}
class ColoredPoint extends Point{
int color;
@Override
public String toString() {
return super.toString()+":color "+color;
}
}
但是在抽象类中的方法中可以调用抽象方法:
如下测试所示(下面程序运行时没有任何输出,原因可能是因为move()方法调用的toString()是Point类中的toString()而不是ColoredPoint类中的toString().
package me.banxi.oo;
abstract class Point{
int x,y;
public abstract String toString();
void move(int x,int y){
toString();
}
}
class ColoredPoint extends Point{
int color;
@Override
public String toString() {
return ":color "+color;
}
}
public class TestAbstractTypeMethod {
public static void main(String[] args) {
ColoredPoint cPoint = new ColoredPoint();
cPoint.move(10, 9);
}
}