A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hmwudizl91zl 中级黑马   /  2013-10-5 15:38  /  2156 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hmwudizl91zl 于 2013-10-6 11:15 编辑

传统意义上Java并没有多继承,所以正确的答案应该是:“没有”或者“有,但是”或者“没有,但是”。单从这点就可以探索出不同的方法来。通常我会问“是否因Java语言的设计者笨到没法实现多重继承”作为我们话题的开始,为什么C++那帮家伙实现了呢?我主要以菱形继承问题来说明:
在面向对象的编程语言中总伴随着多重继承及组织的理解。菱形继承问题就是在如下情景时出现含糊不清的情况:当两个类B和C继承自A,类D同时继承自B和C,如果D中的一个方法调用一个在A中定义的方法(不是覆盖方法).而B和C分别用不同地方式重写(overridden)了方法,那么这个方法到底是继承的哪个类呢,B还是C?
另一探索性的方法是:Java怎么模拟“多重继承”?我想答案已经浮出水面了,就是接口(Interface)。我们经常在Java中讨论接口,那么应试者在什么时候,怎么使用接口的呢?使用接口又有什么好处呢?应试者是否喜欢使用接口?我可以检测他对建模有多熟练,有时还会让他针对接口画画图。我们继续谈论Java中接口的问题,当两个接口有相同的静态域(field),有一个类实现了Java中所谓的“多继承”的两个接口时会出现什么情况?
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface I1 {
String NAME = “codemonkeyism”;
}
public interface I2 {
String NAME = “stephan”;
}
public class C implements I1, I2 {
public static void main(String[] args) {
System.out.println(NAME);
}
}
Java坚持了他们的做法,语言的设计者决定不让其编译通过。
C.java:3: reference to NAME is ambiguous, both variable NAME in I1 and variable NAME in I2 match System.out.println(NAME); ^1 error
还有更多的方法和我们的应试者去探讨多继承的问题,例如:接口中方法的修饰符是什么?对于菱形继承问题使用traits实现混合结构是否比使用接口更好,还是和多继承一样的糟糕?正如我不在那么钟爱继承一样,大量使用继承是一种代码异味。我们还可以和应试者讨论继承的负面因素—–重耦合的例子。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
接口中方法的修饰符是:public abstract
   成员变量的修饰符是:public static final
可以省略,系统会自动补全的。
    另外,你举得例子里,两个接口中的NAME变量都相当于常量,当你用一个类同时实现这两个接口时,自然就发生了不可挽救的错误Error! 就和你上面说的多继承的冲突是一样的:同时继承了两个父类中的两个方法,而这两个方法的方法体还不一样,一下子就把jvm弄懵了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马