【Java笔记】浅谈C++和Java的运行时多态

来源:互联网 发布:怎样加入淘宝联盟 编辑:程序博客网 时间:2024/04/29 00:57

    这篇文章仅提供给同时学习C++和Java的童鞋阅读理解。不罗嗦直接切入正题。

    封装、多态、继承是所有面向对象程序设计语言的共同特征。那就不得不提多态了。多态分为静态多态和动态多态,也就是编译时多态和运行时多态。编译时多态的代表就是函数重载,在此略过它。笔者今天主要描述的是动态多态。

    动态多态的一个典型就是:父类对象引用子类对象,C++中还可以父类对象指针指向子类对象。既然说了C++和Java,那就是要描述一下他们两者的区别。以免大家弄混这两门语言的语法。

public class Child extends Base{    public static void main(String args[]) {                Base base = new Child();                base.function();   //OK        base.function1();  //error            }    public void function() {        System.out.println("child");    }    public void function1() {        System.out.println("child");    }}class Base{    public void function() {        System.out.println("base");    }}

共同点:

    编译时base是Base的对象,运行时base是Child的对象。编译阶段,父类对象引用子类对象的时候,只能调用父类中存在的方法。因为在编译阶段编译器知道base是Base的对象,而Base类中只有 function() 这个方法。因此尝试调用子类特有的方法是不可行的。编译器会提示base没有 function1() 这个方法。

    小结:父类对象仅能调用编译时父类所拥有的方法。

区别:

    C++中,在运行时父类对象调用的成员函数仍然是父类的成员函数,即使子类重写了父类的成员函数。

    而在Java中,运行时,父类对象其实已经成为了子类的对象,它所调用的是子类的方法。

    !!!但是:C++的功能并不是这么弱,要想实现Java中的那种情形,那就要用到虚函数了。即:将被子类覆盖的函数定义为虚函数。笔者可以自行学习C++中的虚函数这一概念,推荐书籍《C++ Primer》。



0 0
原创粉丝点击