接到一个电话面试,面试官问了这样一个问题:
如果一个子类继承一个父类,并且该子类重写了父类的一个方法.那么在把一个父类对象强行转化为子类对象后,再执行重写的方法,那调用的是父类还是子类的方法?
听完后就觉得这个问题有点问题--把一个父类强行转化为一个子类,编译通得过吗?
所以我问面试官,您说的是把一个父类引用复制给一个子类引用,还是说直接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.或许面试官就是故意问一个编译不过的问题,他想听到的答案就是我说编译不过.可惜,我当时没这么认为.
以上是问题的分析和结论,若有写的不对的地方欢迎博友们灌水解答.