[Java面向对象]接口的声明和实现继承

画师:竹取工坊

大佬们好!我是Mem0rin!现在正在准备自学转码。

如果我的文章对你有帮助的话,欢迎关注我的主页Mem0rin,欢迎互三,一起进步!

文章目录

前言:在现实中我们会遇到很多的接口:Type-C, USB,以及3.5mm耳机接口等等,这些接口能够推行的重要原因是:通用。

也就是说,接口作为公共的规范,是具有普遍性的抽象方法的集合。因此在Java中我们定义了接口(interface),作为抽象方法的集合。

一、接口的定义

在Java中,接口的定义是把定义类的class改成interface即可。

java 复制代码
public interface IAnimal {
    public void eat();//在接口中,方法默认是public abstract的
    public void travel();
    int a = 1;//在接口中,成员变量默认是public static final的
}

在接口中,成员变量是默认被 public static final 修饰的,成员方法默认是被 public abstract 修饰的,因此在接口的成员方法和抽象方法一样,是没有主体的。

并且接口内是不允许出现静态代码块和构造方法的。

java 复制代码
public interface IAnimal {
    //编译出错
    public IAnimal() {
    
    }
    {}//编译出错

二、接口的使用

同时一个设备可以拥有多个接口,因此在使用过程中我们希望一个类可以实现多个接口,而不是继承中只能有一个父类。

在Java中,接口不能直接使用,我们用 implements 关键词来实现接口。

java 复制代码
public class Dog implements IAnimal{

    private String name;

    public Dog(String name) {
        this.name = name;
    }

    public void eat(){
        System.out.println("Dog eats");
    }

    public void travel(){
        System.out.println("Dog travels");
    }

    public int noOfLegs(){
        return 0;
    }

    public static void main(String args[]){
        Dog dog = new Dog("旺财");
        dog.eat();
        dog.travel();
    }
}

在具体的接口实现过程中,需要注意的是:

在实现接口的时候,需要重写接口的所有方法,除非实现接口的类本身也是抽象类(因为接口的方法默认是 public abstract 的)。

一个类可以实现多个接口,在类声明中语句类似于:

复制代码
... implements 接口名称[, 其他接口, 其他接口..., ...] ...

接口和类的异同见下图:

三、接口的继承

接口可以用 extends 关键字继承另一个接口,子接口会继承父接口的方法,比如以下实例:

java 复制代码
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

四、接口的应用

我们说继承是 xx IS-A xxx,而接口则是 xxx具有某种属性,具体来讲,如果有 DogCatDuck 类,我们可以把三者抽象成一个 Animal 类,也可以只把部分对象的属性提取出来,比如 DogDuck 都会游泳,那我们就可以创建一个 ISwimming 的类,用来实现游泳的功能。

照着这样的思想我们可以写出以下示例:

Animal 类:

java 复制代码
public class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }

}

IFlyingISwimmingIRunning的接口:

java 复制代码
public interface IFlying {
    void fly();
}
public interface ISwimming {
    void swim();
}
public interface IRunning {
    void run();
}

Bird 类:可以走可以飞

java 复制代码
public class Bird extends Animal implements IFlying, IRunning{

    public Bird(String name) {
        super(name);
    }

    public void fly() {
        System.out.println("小鸟在飞");
    }

    public void run() {
        System.out.println("小鸟在走");
    }
}

Dog 类:可以走可以游泳

java 复制代码
public class Dog extends Animal implements IRunning, ISwimming{
    public Dog(String name) {
        super(name);
    }

    public void run() {
        System.out.println("小狗在走");
    }

    public void swim() {
        System.out.println("小狗在游泳");
    }
}

Duck类:可以走可以飞可以游泳

java 复制代码
public class Duck extends Animal implements ISwimming, IFlying, IRunning{

    public Duck(String name) {
        super(name);
    }

    public void fly() {
        System.out.println("鸭子在飞");
    }

    public void run() {
        System.out.println("鸭子在走");
    }

    public void swim() {
        System.out.println("鸭子在游泳");
    }

}

最后我们用 Test 类测试代码:

java 复制代码
public class Test {
    public static void swim(ISwimming swim) {
        System.out.println("执行swim()");
        swim.swim();
    }

    public static void run(IRunning run) {
        System.out.println("执行run()");
        run.run();
    }

    public static void fly(IFlying fly) {
        System.out.println("执行fly()");
        fly.fly();
    }

    public static void main(String[] args) {
        Dog dog = new Dog("旺财");
        run(dog);
        swim(dog);

        Bird bird = new Bird("jiji");
        run(bird);
        fly(bird);

        Duck duck = new Duck("gaga");
        run(duck);
        swim(duck);
        fly(duck);

    }

}

得到的结果如下:

复制代码
执行run()
小狗在走
执行swim()
小狗在游泳
执行run()
小鸟在走
执行fly()
小鸟在飞
执行run()
鸭子在走
执行swim()
鸭子在游泳
执行fly()
鸭子在飞

这也是多态的一种体现。

相关推荐
阿猿收手吧!2 小时前
【C++】深入解析日志框架调用链
开发语言·c++
m0_528174452 小时前
多平台UI框架C++开发
开发语言·c++·算法
jing-ya2 小时前
day 53 图论part5
java·数据结构·算法·图论
haokan_Jia2 小时前
postgresql实现数据动态地图切片服务
java·服务器·前端
014-code2 小时前
Spring Boot 自动配置原理深度解析
java·spring boot·后端·spring
catchadmin2 小时前
告别阻塞!用 PHP TrueAsync 实现 PHP 脚本提速 10 倍
开发语言·php
康小庄2 小时前
JVM学习——Gc Roots
java·jvm·spring boot·学习·spring
sdanss2 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
金銀銅鐵2 小时前
Byte Buddy 生成的类的结构如何?(第一篇)
java·后端