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

这也是多态的一种体现。

相关推荐
萧瑟余晖6 分钟前
JDK 26 新特性详解
java·开发语言
马优晨41 分钟前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区2 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大3 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai3 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说3 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
এ慕ོ冬℘゜3 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa4 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
一次旅行4 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化
Zane19944 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端