今天看到有人说Cpp有接口,我感到很奇怪,因为从来没有听说过。而Java中恰好有interface。目测是把Java的东西拿过来用了。于是就决定查下资料,顺便复习下Java。
虚函数
C++的虚函数需要加上virtual关键字,而只有虚函数才会有动态绑定,根据对象的动态类型来决定调用对应的虚函数。而Java貌似没有这概念,也即是
Java中除了static和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。
摘自《Java编程思想》第四版Page151
Java中的abstract关键字
在Java中,如果方法加上abstract关键字,就是一个抽象方法,抽象方法仅有声明而没有方法体。
abstract void f();
这里的抽象方法与Cpp的纯虚函数应该类似。
virtual void f() = 0;
包含抽象方法的类叫做抽象类,如果一个类包含一个或多个抽象方法,该类必须限定为抽象的。(否则编译器就会报错)
摘自《Java编程思想》第四版Page169
这里应该和Cpp里面的抽象基类是差不多的,如果继承抽象基类(或抽象类)的派生类不给出所有的纯虚函数(或抽象方法)的定义,就无法实例化,因为该派生类仍然是抽象基类(抽象类)。
之所以上面说差不多,是因为我发现了个好玩的现象,即抽象类可以强行加上abstract关键字定义而不需要一定有抽象方法。即只要一个Java类加上了abstract关键字,它就是一定是一个抽象类。而Cpp并没有与abstract类似的关键字。
Test.java public class Test { public static void main(String[] args) { System.out.println("test"); T t = new T(); // S s = new S(); /* Test.java:7: 错误: S是抽象的; 无法实例化 S s = new S(); ^ 1 个错误 */ t.f(); t.g(); } } abstract class S { void f() { System.out.println("S"); } } class T extends S { void g() { System.out.println("T"); } }
结果输出:
test
S
T
Java中的接口interface
Java里面的接口,方法全部是抽象方法,变量全部是public static final,对应Cpp的接口,说的应该是只有纯虚函数的抽象基类,然而又有所不同,毕竟即使抽象基类里只有纯虚函数,也不需要全是public的,变量也不需要全是public static的(Cpp变量不能用final)。