张三和李四一同到一家公司去应聘,二人被安排同时接受经理的面试。
经理拿出一个代码片段:
-
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......”
总结一下,继承是不允许多继承的,怕的就是这种两个方法一样,那 jvm根本不知道怎么办,另外就是接口的多实现中如果两个方法不一模一样,那么也不会让同时实现这两个接口