张三和李四一同到一家公司去应聘,二人被安排同时接受经理的面试。
经理拿出一个代码片段:
public class Father {
public void makeMoney(){
System.out.println("赚了1亿");
}
}
public class Mother {
public void makeMoney(){
System.out.println("赚了5000万");
}
}
public class Son extends Father extends Mother{
@Override
public void makeMoney() {
System.out.println("赚了500万");
}
public static void main(String[] args) {
Son son = new Son();
son.makeMoney();
}
}
经理问:运行Son的main方法,会发生什么?
张三见状,抢答道:“这么简单,500万!”
经理看没说话,看着李四。
李四扫了一眼代码,缓缓的说了一句:第一行,第27个字符那里,eclipse会提示"Syntax error on token "extends", implements expected",intellj idea会提示"{ expected"。
经理:,不好意思,弄错了,我改一下?
张三:"......"
public class Son extends Father , Mother{
@Override
public void makeMoney() {
System.out.println("赚了500万");
}
public static void main(String[] args) {
Son son = new Son();
son.makeMoney();
}
}
经理:这样呢?
张三又是第一个回答:这回总是500万吧,反正不是1亿,也不是5000万。
李四回答:eclipse会提示...
还没等李四说完,经理突然打断:行了,行了,你就告诉我这样写有没有问题,有什么问题。
李四继续回答:早说嘛,这样写有问题,会编译不通过,因为java不允许多重继承。
张三:多重继承,什么玩意儿
李四:假设java允许多重继承,那么Son就可以重载Father和Mother中的方法,这两个方法的参数列表、方法签名都是一样的,java会搞不清楚到底是重载Father还是Mather的方法。但如果你把Father、Mother都改成interface,就算他们的参数列表、方法签名都是一样的,由于接口并不提供实现。所以,并没有冲突
经理:既然你提到了interface,那我接下来把Father改成这样,然后Son同时实现这两个接口,应该怎么写呢?
public interface IFather {
void makeMoney(String date);
}
public interface IMother {
long makeMoney(String date);
}
张三:你把IMother中的makeMoney的返回值也改掉了,呵呵,幸亏我眼尖呐,看我的。
张三迅雷不及掩耳地写出了代码
public class Son implements IFather , IMother{
public static void main(String[] args) {
Son son = new Son();
}
@Override
public void makeMoney(String date) {
}
@Override
public long makeMoney(String date) {
}
}
经理:哈哈哈...
经理冷笑一声,问李四:你写的代码呢,写不出来吗。
李四并不着急,只是说了一句:不是我写不出来,是java不让我写啊。
张三:java不让你写?手长在你身上,怎么不让你写了,我看你就是不会。
经理对张三说:张先生,很高兴您来我们这里面试,我认为您不能胜任我们的工作,这次面试就到这里了,谢谢。
张三:什么意思,你现在只出了一道题,我也给出了正确答案。不行,我不走,我要继续答题。
经理:保安!
“我要继续面试啊,你们干什么?老子会spark......”