起因:刷题是遇到一个基础题,题如下:
以下关于面向对象的描述错误的是:
-
面向对象的基本特性是封装,继承和多态
-
构造函数不可以是虚函数,析构函数可以是虚函数
-
子类重新定义父类虚函数的方法叫做重载
-
多态是为了接口重用,封装和继承是为了代码重用
一 . 虚函数的定义
在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。----(百度百科)
这里的 “基类” 可以理解为--接口。
下面看Java代码:
package test;
class A{
public void YOU(){
System.out.println("YOU in A is called");
}
}
class B extends A{
public void YOU(){
System.out.println("YOU in B is called");
}
}
public class VirtualTest {
public static void main(String args[]) {
A a = new A();
B b = new B();
A p;
p = a;
p.YOU();
p = b;
p.YOU();
}
}
运行上面的代码可以看到输出的结果:
YOU in A is called;
YOU in B is called;
以上代码中,定义了一个基类(在java中应该叫引用)去指向不同的对象,可以发现同样可以实现多态。
也就是说,java的普通成员函数(没有被static、native等关键字修饰)就是虚函数。
原因很简单,它本身就实现虚函数实现的功能------多态。
(以上只是本人的一个泛泛理解,若想更透彻的理解,可以用Java二进制运行,或者结合c++虚函数对比)