1 问题
Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢?
2 方法
- 多层继承
如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承一般不建议超过三次。 - 接口
接口可用于继承也可用于其它,比较灵活。定义类实现接口,需要实现其所有父接口的方法。
多层继承: package weekbook; class A{//父类A类 private int num=10; public int getNum(){ return this.num; } public void fun(){ System.out.println("你今天天气真好!"); } } class B extends A{//B类继承A类 private String name="张三"; public String getName(){ return this.name; } public void fun(){//方法覆写 System.out.println(this.getNum()); //父类私有域被继承但不可直接使用,需通过getter方法间接获得私有域的内容 //子类中没找到那么会去父类中寻找 } } class C extends B{//C类继承B类,相当于间接继承A类 private String name="李四"; public String getName(){ return this.name; } public void fun(){//方法覆写(结果为覆写后的内容) System.out.println(this.getName()); System.out.println(this.name); } } public class Test{ public static void main(String[] args){ A a=new A(); a.fun(); print(new B());//向上转型(优点在于子类可自动进行向上转型,可实现参数的统一) print(new C()); } public static void print(A a){ a.fun(); } } 接口: package weekbook; interface IA{//父接口A(接口为更纯粹的抽象类,结构组成只含全局常量和抽象方法) void funA(); } interface IB {//父接口B(接口前添加I用以区分接口) void funB(); } interface CImpl extends IA,IB{//接口可继承多个父接口,用,分隔开即可,子接口的命名可选择较为重要的父接口进行命名或自行命名,一般子接口后添加Impl用以区分 void funC(); } class Impl implements CImpl{//定义类实现接口(也可直接实现父接口(多个)) public void funC(){//抽象方法的实现 System.out.println("昨天吃串串!"); } public void funA(){ System.out.println("今天吃火锅!"); } public void funB(){ System.out.println("明天吃冒菜!"); } } public class Test1{ public static void main(String[] args){ Impl im=new Impl();//实例化对象 im.funA(); im.funB(); im.funC(); } } |
3 结语
针对如何实现多继承的问题,提出利用多层继承和接口的方法,通过实验,证明该方法是有效的,本文的每种方法都有各自的短处,多层继承一般不超过三层 。接口实现多继承时,一个Java接口加入一个新的方法时,所有实现这个接口的类都得编写具体的实现。在未来,我们可以探索利用成员内部类来实现多继承的方法。