美文网首页Android
Java中可实现多继承的三种方法(多层继承/内部类/接口)

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

作者: 瑟闻风倾 | 来源:发表于2019-12-05 14:41 被阅读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

相关文章

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

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

  • Java并发

    使用线程 Java中有三种使用线程的方法: 实现 Runnable 接口; 实现 Callable 接口; 继承 ...

  • 继承

    java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是可实现多接口。 1:成员变量。当子父类...

  • java046接口和类之间的各种关系

    1.类与类:继承关系,单一继承,多层继承 2.类与接口:实现关系,多实现(因为里面的方法都是抽象方法) inter...

  • 面向对象三大特性

    三大特性:继承 封装 多态 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。 封装 封...

  • 多线程

    java中实现多线程操作有两种方法:继承Thread类和实现Runnable接口 一、继承Thread类 //继承...

  • 面试-实现多线程的方式

    Java中实现多线程的方式有下面三种: 继承Thread类,重写run方法 实现Runnable接口,重写run方...

  • 第十三章接口

    Java中继承为单继承,只有一个父类 接口 特性 接口不能被实例化 实现类必须实现接口的所有方法 实现类可以实现多...

  • Java中关于多重继承的问题

    多重继承的含义 一.用接口实现多重继承 二.用内部类实现多重继承

  • 看一眼就能学会的JS实现继承笔记

    前言 学习过 java 的同学应该都知道,常见的继承有接口继承和实现继承,接口继承只需要继承父类的方法签名,实现继...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/diykgctx.html