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);
	}

}