[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()
鸭子在飞

这也是多态的一种体现。

相关推荐
Flittly1 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了1 小时前
Java 生成二维码解决方案
java·后端
人活一口气6 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP7 小时前
Vibe Coding -- 完整项目案例实操
java
荣码7 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing7 小时前
Google第三方授权登录
java·后端·程序员
明月光8187 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑17 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯17 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路21 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java