天天看点

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

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

接着我的文章当中C++静态绑定和动态绑定的例子.

一个简单的形状类:

如下:

形状表示一种抽象的概念.所以如果是在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()方法.

但是在抽象类中的方法中可以调用抽象方法:

如下测试所示(下面程序运行时没有任何输出,原因可能是因为move()方法调用的toString()是Point类中的toString()而不是ColoredPoint类中的toString().