• 面试的小问题多态中的子类与父类函数调用


    接到一个电话面试,面试官问了这样一个问题:

    如果一个子类继承一个父类,并且该子类重写了父类的一个方法.那么在把一个父类对象强行转化为子类对象后,再执行重写的方法,那调用的是父类还是子类的方法?

    听完后就觉得这个问题有点问题--把一个父类强行转化为一个子类,编译通得过吗?

    所以我问面试官,您说的是把一个父类引用复制给一个子类引用,还是说直接new一个父类给一个子类?

    答:这里不涉及引用的问题,和引用没关系!

    我想面试官的问题应该不至于连编译都通不过吧,回答:这种情况那肯定是调用父类的方法了.

    回答是:不对,是调用了子类的方法.如果你不信你可以去调试运行看看.

    挂电话后,怎么想都觉得这个问题有点蹊跷.平时做开发时,在c#中,像这样的情况见到的也不少了,而且肯定是编译不过的,难道在java中就可以了吗?(面试的职位是java开发)

    于是决定写点代码跑跑看,到底是怎么回事.好久没做java,一直做.net开发,就不用eclipse了,直接拿vs2008来用.

    代码
    namespace Generic
    {
    class Program
    {
    static void Main(string[] args)
    {
    Person p
    = new Person();
    ChinaPerson cp
    = (ChinaPerson)p;//(ChinaPerson)new Person();//(ChinaPerson)p;
    cp.Printf();
    }
    }

    class Person
    {
    public void Printf()
    {
    Console.WriteLine(
    "111");
    }
    }

    class ChinaPerson : Person
    {
    public void Printf()
    {
    Console.WriteLine(
    "222");
    }
    }
    }

    上面代码编译肯定是没问题的,但是运行时会报错--无法将类型为“Generic.Person”的对象强制转换为类型“Generic.ChinaPerson”。

    而且Main函数中的第二行:ChinaPerson cp = (ChinaPerson)p;

    如果改为ChinaPerson cp = p;编译不过.(这是肯定的了)

    很明显,我理解的C#的编译和运行时规范是没问题的.那么像上面同样功能的java代码如果能很好的编译运行的话,难道说java和C#在这个基本问题上有了这么大的出入?不过我觉得这是不可能的.原因嘛--还用说吗,采用OOP的强类型语言不可能出现这种问题.

    分析和结论:

    1.最囧的可能是我当时听错了面试题目--面试官可能想问的是把子类对象转化给一个父类,如果父类调用方法的时候,调用的是子类的还是父类的.

    但如果是这样的话,面试官应该就不需要特别强调[强行转化]了,所以这个分析不对.而且这个职位的待遇不低,不至于问这么浅显的问题

    2.或许面试官就是故意问一个编译不过的问题,他想听到的答案就是我说编译不过.可惜,我当时没这么认为.

    以上是问题的分析和结论,若有写的不对的地方欢迎博友们灌水解答.

  • 相关阅读:
    PowerDesigner生成SQL的冒号设置
    Linux/Windows 一键获取当前目录及子目录下所有文件名脚本
    Target runtime jdk1.8.0_181 is not defined
    windows——任务计划程序
    12篇文章回顾总结
    《逆商》2月12日
    《终身成长》2月11日
    《心流》 什么才是真正的幸福
    《心流》 什么才是真正的幸福 2月7日
    《高效能人士的7个习惯》 2月3日
  • 原文地址:https://www.cnblogs.com/bbls/p/1925358.html
Copyright © 2020-2023  润新知