java是没有多继承的,只能通过接口的方式来实现这个功能。这点大家也都知道。今天看到一个interface写法很怪异,想了半天没想明白。开始还以为是自己太久没看java生疏了,问别人居然也不懂,上网一查才看到这样的写法:
认为正确使用物件导向技术中之「多重继承」观念﹐应该如下面的例子:
假设有一个木造门﹐则:
1. 此木造门是门的一种(a kind of)。
2. 但门不是木造门的一部份(a part of)。
3. 木造门是木制品的一种。
4. 但木制品不是木造门的一部份。
5. 木制品不是门的一种。
6. 门也不是木制品的一种。
所以您可以发现﹐多重继承在使用时﹐必须非常小心﹐而且在许多时候﹐其实我们并不需要多重继承的。
Java也提供继承机制﹐但还另外提供一个叫interface的概念。由于Java的继承机制只能提供单一继承(就是只能继承一种父类别)﹐所以就以Java的interface来代替C++的多重继承。interface就是一种介面﹐规定欲沟通的两物件﹐其通讯该有的规范有哪些。如以Java程式语言的角度来看﹐Java的interface则表示:一些函数或资料成员﹐为另一些属于不同类别的物件所需共同拥有﹐则将这些函数与资料成员﹐定义在一个interface中﹐然后让所有不同类别的Java物件可以共同操作使用之。
所以﹐对于Java的继承与interface﹐我们总结如下:
1.Java的class只能继承一个父类别(用extends关键字)﹐但可以拥有(或称实作)许多interface(用implements关键字)。
2.Java的interface可以继承许多别的interface(也是用extends关键字)﹐但不可以实作任何interface。
因此﹐我们可以利用Java的interface来模拟C++的多重继承。如上面的例子可以转化如下:
interface Test1 {
public void f1();
public void g1();
}
interface Test2 {
public void f2();
public void g2();
}
interface Test3 extends Test1, Test2 {
public void gg();
}
class CTest implements Test3 {
public void f1() { System.out.println("Test1::f1()"; }
public void g1() { System.out.println("Test1::g1()"; }
public void f2() { System.out.println("Test2::f2()"; }
public void g2() { System.out.println("Test2::g2()"; }
public void gg() { System.out.println("Test3::gg()"; }
}
class Run {
public void run() {
CTest ct=new CTest();ct.f1();ct.f2();
ct.g1();ct.g2();ct.gg();
}}
class Main {
public static void main (String args[]) {
Run rr=new Run();
rr.run();
}}