java 接口的继承和示例

205 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

接口的多继承【理解】

一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用 extends 关键字,子接口继承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。 代码如下:

定义父接口:

interface A {
    public default void method(){
        System.out.println("AAAAAAAAAAAAAAAAAAA");
    }
}
​
interface B {
    public default void method(){
        System.out.println("BBBBBBBBBBBBBBBBBBB");
    }
}

定义子接口:

interface D extends A,B{
    @Override
    public default void method() {
        System.out.println("DDDDDDDDDDDDDD");
    }
}

小贴士:

子接口重写默认方法时,default关键字可以保留。

子类重写默认方法时,default关键字不可以保留。

小结:接口和接口之间是继承的关系,而不是实现。一个接口可以继承多个接口。

其他成员特点

  • 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。
  • 接口中,没有构造方法,不能创建对象。
  • 接口中,没有静态代码块。

接口和抽象类

抽象类:
    本质是一个类class
    抽象类有构造方法,抽象类我们不能创建对象
    可以有抽象方法
接口:
    本质是一个interface
    接口没有构造方法,也不能创建对象
    方法不加修饰符,自动就是抽象方法
    
接口的作用:
    弥补了单继承的问题,因为接口可以同时实现多个
    
共同点:
    接口和抽象类都要有子类。

抽象类和接口的综合案例

  • 案例图:

运动员案例.png

  • 用到的知识点:

    类、抽象类、接口、继承、实现

  • 代码实现:

    //人类
    public abstract class Person {
        //姓名
        String name;
        //年龄
        int age;
    ​
        //构造方法
        public Person() {
        }
    ​
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
//运动员类
public abstract class Athlete extends Person {
​
    //提供自己的构造方法
    public Athlete() {
        //super();
    }
​
    public Athlete(String name, int age) {
        super(name, age);
    }
​
    //学习
    public abstract void study();
}
//教练类
public abstract class Coach extends Person {
    //编号
    String id;
    //空参构造
    public Coach() {
    }
​
    //有参构造
    public Coach(String name, int age, String id) {
        //姓名和年龄赋值给父类
        super(name, age);
        //编号赋值给自己的成员变量
        this.id = id;
    }
    
    //教学
    //父类中不知道到底教啥 定义成抽象方法  在子类中自己重写
    public abstract void teach();
}
//篮球运动员
public class BasketAthlete extends Athlete implements English{
​
    //构造方法
​
    public BasketAthlete() {
    }
​
    public BasketAthlete(String name, int age) {
        super(name, age);
    }
​
    @Override
    public void study() {
        System.out.println(age +"岁的篮球运动员"+name + "在打篮球");
    }
​
    @Override
    public void speakEnglish() {
        System.out.println("篮球运动员出国说英语");
    }
}
//篮球教练
public class BasketCoach extends Coach implements English{
    //构造方法
    public BasketCoach() {
    }
​
    public BasketCoach(String name, int age, String id) {
        super(name, age, id);
    }
​
    @Override
    public void teach() {
        System.out.println("编号为" + id + "年龄为" + age + "姓名叫" + name + "的篮球教练教扣篮");
    }
​
    @Override
    public void speakEnglish() {
        System.out.println("篮球教练出国说英语");
    }
}
public class FootAthlete extends Athlete {
    //构造方法
​
    public FootAthlete() {
    }
​
    public FootAthlete(String name, int age) {
        super(name, age);
    }
​
    @Override
    public void study() {
        System.out.println(age + "岁的足球运动员" + name + "在踢足球");
    }
}
//足球教练
public class FootCoath extends Coach {
    //构造方法
​
    public FootCoath() {
    }
​
    public FootCoath(String name, int age, String id) {
        super(name, age, id);
    }
​
    @Override
    public void teach() {
        System.out.println("编号为" + id + "年龄为" + age + "姓名叫" + name + "的足球教练教射门");
    }
}
//接口
public interface English {
    //学英语(抽象方法)
    void speakEnglish();
}
public class Demo测试类 {
    public static void main(String[] args) {
        //足球教练
        FootCoath fc = new FootCoath("柳岩",20,"001");
        //调用方法
        fc.teach();
​
​
        System.out.println("--------------");
        //篮球运动员
        BasketAthlete ba = new BasketAthlete("蔡徐坤",35);
        ba.study();
        ba.speakEnglish();
    }
} 

讲完抽象类和接口后,相信有许多同学会存有疑惑,两者的共性那么多,只留其中一种不就行了,这里就得知道抽象类和接口从根本上解决了哪些问题.

一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口, 接口弥补了Java的单继承

抽象类为继承体系中的共性内容, 接口为继承体系中的扩展功能

接口还是后面一个知识点的基础(lambada)