Java中的接口抽象方法与C++中的抽象类纯虚函数_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > Java中的接口抽象方法与C++中的抽象类纯虚函数

Java中的接口抽象方法与C++中的抽象类纯虚函数

 2011/10/14 9:37:59  banxi1988  http://banxi1988.iteye.com  我要评论(0)
  • 摘要:Java中的接口抽象方法与C++中的抽象类纯虚函数接着我的文章当中C++静态绑定和动态绑定的例子.一个简单的形状类:如下:classFigure{public:Figure(){_name="Figure";}virtualstringgetName()const{return_name;}virtualdoublearea()const=0;private:string_name;};形状表示一种抽象的概念.所以如果是在Java中的话Figure应该定义为一个抽象类
  • 标签:方法 函数 c++ Java 接口 抽象
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);
	}

}

发表评论
用户名: 匿名