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

6 篇文章 0 订阅
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);
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值