Android

Java中可实现多继承的三种方法(多层继承/内部类/接口)

2019-12-05  本文已影响0人  瑟闻风倾

Java不支持多继承,但是通过一些巧妙的设计来达到和多继承同样的效果 :通过继承、内部类和接口互相配合,达到多继承的效果。

  • java类不可直接多继承,但可通过多层继承实现多继承。
    但多层继承一般建议不超过三次,且代码较冗余。
  • java类只可单继承一个具类,但可实现多个接口。
    新类可继承自一个具类class,其余继承都得是interfaces。
  • java类不能继承多个具类,但我们可在其内部设多个inner class,每个inner class都能各自继承某一实现类。
    inner class不受限于outer class 是否已经继承自某一实现类, inner class可以说是多重继承问题的完整解决方案。

1. 多层继承

public class GrandpaA {
    private int age = 60;
    public int getAge(){
        return this.age;
    }
    public void fun(){
        System.out.println("爷爷厨艺真棒!");
    }

}
public class FarterB extends GrandpaA{
    private String name="李卫聆";
    public String getName(){
        return this.name;
    }
    @Override
    public void fun(){//方法覆写
        System.out.println(this.getAge());//父类私有域被继承但不可直接使用,需通过getter方法间接获得私有域的内容
    }

}
public class SonC extends FarterB{//C类继承B类,相当于间接继承A类
    private String name="李萧然";
    public String getName(){
        return this.name;
    }
    @Override
    public void fun(){//方法覆写(结果为覆写后的内容)
        System.out.println(this.getName());
        System.out.println(this.name);
    }

    public static void main(String[] args){
        GrandpaA a = new GrandpaA();
        a.fun();
        print(new FarterB());//向上转型(优点在于子类可自动进行向上转型,可实现参数的统一)
        print(new SonC());
    }
    public static void print(GrandpaA a){
        a.fun();
    }

}
多层继承.png

2. 成员内部类可直接实现多继承

(1) 示例1

public class GrandmaA {
    private int age = 58;
    public int getAge(){
        return this.age;
    }
    public void fun(){
        System.out.println("外婆厨艺真棒!");
    }
}
public class MotherB {
    private String name="刘青瑶";
    public String getName(){
        return this.name;
    }
    public void fun(){//方法覆写
        System.out.println("妈妈厨艺真棒!");
    }
}

public class DaughterC {
    class OneA extends GrandmaA{//C中内部类继承A类
        public void printA(){
            System.out.println(this.getAge());
            fun();
        }
    }
    class OneB extends MotherB{//C类内部类继承B类
        public void printB(){
            System.out.println(this.getName());
            fun();
        }
    }
    public void print(){//在C类中生成普通方法print()
        new OneA().printA();//匿名实例化OneA类对象并调用printA方法
        new OneB().printB();
    }

    public static void main(String[] args){
        DaughterC c = new DaughterC();//实例化C类对象
        c.print();//调用C中print方法
    }
}

成员内部类.png

(1) 示例2

假如有一个Phone类,里面实现了一个可以打电话的功能的方法callSomebody(String phoneNum);一个Message类,里面实现了一个可以发信息功能的方法sendToSomebody(String phoneNum);还有一个类Human,这个Human类想实现打电话和发信息的功能,我们知道可以用继承来获得父类的方法,但是java原则上是不允许多继承只可以单继承,也就是说只可以实现其中一个类里面的方法,这并不满足我们的需求。可以使用内部类实现多继承的效果,实现调用两个类中的方法。

package comi.example.liy.javatestdemo;

/**
 * Created by liy on 2019-12-04 17:14
 */
public class Phone {
    public void callSomebody(String phoneNum){
        System.out.println("我在打电话喔,呼叫的号码是:" + phoneNum);
    }

}

package comi.example.liy.javatestdemo;

/**
 * Created by liy on 2019-12-04 17:15
 */
public class Message {
    public void sendToSomebody(String phoneNum){
        System.out.println("我在发短信喔,发送给 :" + phoneNum);
    }
}

package comi.example.liy.javatestdemo;

/**
 * Created by liy on 2019-12-04 17:16
 * 内部类实现多继承的效果
 */
public class Human {
    private class MyPhone extends Phone {

    }
    private class MyMessage extends Message{

    }

    private MyPhone phone = new MyPhone();
    private MyMessage message = new MyMessage();

    public void humanCall(String phoneNum){
        phone.callSomebody(phoneNum);
    }

    public void humanSend(String mes){
        message.sendToSomebody(mes);
    }

    public static void main(String[] args) {
        Human phone = new Human();
        phone.humanCall("110");
        phone.humanSend("119");
    }

}

运行结果:


利用内部类实现多继承的效果.png

3. 接口实现多继承

在同时可用内部类和接口时,优先使用接口。因为内部类需应用于继承关系,接口既可用于继承也可用于其他,比较灵活。

public interface ICatA {
    void climb();
}
public interface IDogB {
    void eat();
}
public interface IRabbitC {
    void run();
}

(1) 同时实现多个接口示例

package comi.example.liy.javatestdemo1;

/**
 * Created by liy on 2019-12-05 13:22
 */
public class Tiger implements IRabbitC, ICatA, IDogB {
    @Override
    public void run() {
        System.out.println("老虎跑得快");
    }

    @Override
    public void climb() {
        System.out.println("老虎不会爬树");
    }

    @Override
    public void eat() {
        System.out.println("老虎要吃肉");
    }

    public static void main(String[] args){
        Tiger tiger = new Tiger();//实例化对象
        tiger.run();
        tiger.climb();
        tiger.eat();
    }
}

实现多个接口.png

(2) 接口多继承示例

public interface IMonkeyC extends ICatA, IDogB {
    void run();
}
package comi.example.liy.javatestdemo1;

/**
 * Created by liy on 2019-12-05 13:11
 */
public class Human implements IMonkeyC {
    @Override
    public void run() {
        System.out.println("人类跑得快");
    }

    @Override
    public void climb() {
        System.out.println("人类爬树退化了");
    }

    @Override
    public void eat() {
        System.out.println("人类是杂食动物");
    }

    public static void main(String[] args){
        Human human = new Human();//实例化对象
        human.run();
        human.climb();
        human.eat();
    }

}
接口多继承.png
上一篇下一篇

猜你喜欢

热点阅读