java:Java中的接口

什么是接口

概念:

官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
我的解释:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。(理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成的)。接口是解决Java无法使用多继承的一种手段,但是接口在实际中的更多的作用是指定标准的。或者我们可以直接把接口理解为100%的抽象类,即接口中的方法必须全部是抽象方法。

接口和类的区别:

接口(Interface)和类(Class)是 Java 中两种不同的概念,它们有一些重要的区别,主要包括以下几点:

定义:

  • 类是一种具体的实体,可以包含属性(字段)和方法的实现。
  • 接口是一种抽象的定义,只包含方法的声明而没有方法的实现。

继承:

  • 类可以使用继承来扩展另一个类的属性和方法。
  • 接口可以通过实现(implements)来定义类的行为,一个类可以实现多个接口。

多态性:

  • 类之间的多态性主要通过继承和方法重写来实现。
  • 接口之间的多态性主要通过接口的实现来实现,一个类可以实现多个接口,从而具有多个不同的行为。

实例化:

  • 类可以被实例化为对象,对象可以调用类中定义的属性和方法。
  • 接口本身不能被实例化,但是可以通过实现接口的类来创建对象,并调用接口中定义的方法。

抽象性:

  • 类可以是抽象类(abstract class),包含抽象方法和普通方法。
  • 接口本身就是抽象的,所有方法都是抽象方法,不包含方法的具体实现。

多继承:

  • 类在 Java 中不支持多继承,即一个类只能继承一个父类。
  • 接口支持多继承,一个类可以实现多个接口,从而获得多个接口的行为。

接口的定义

在 Java 中,定义一个接口需要遵循以下步骤:

  1. 使用 interface 关键字声明接口,接口的命名通常使用首字母大写的驼峰命名规则。
  2. 在接口中定义需要暴露给外部的方法,方法声明只包含方法的签名,不包含方法体。方法可以包含参数和返回类型。
  3. 接口中的方法默认是公共的(public),可以省略 public 关键字。
  4. 接口中可以定义常量,常量默认是静态的和最终的(static final),可以省略这两个修饰符。
  5. 接口中的方法可以包含默认实现,使用 default 关键字进行声明。

下面是一个简单的接口定义示例:

java 复制代码
public interface Animal {
    // 定义一个抽象方法
    void eat(String food);

    // 定义一个默认方法
    default void sleep() {
        System.out.println("Animal is sleeping");
    }

    // 定义一个常量
    int LEGS = 4;
}

在上面的示例中,定义了一个名为 Animal 的接口,包含了一个抽象方法 eat、一个默认方法 sleep 和一个常量 LEGS。接口中的方法和常量都是公共的,并且不需要使用 public 关键字进行修饰。


接口的特点

1.接口成员变量的特点:

接口中没有成员变量,只有公有静态常量。

即默认情况下属性前都会有public static final 这三个关键字修饰。如下:

java 复制代码
public static final 数据类型 常量名=常量值;

初始化

final修饰的属性必须初始化,我们在接口中定义公有的静态常量时,必须在定义时就赋初值。(否则idea报错)。

演示:

正确的:

错误的:

2.接口成员方法的特点:

@.1在JDK7.0版本及之前版本中,接口中仅支持共有的抽象方法:

public abstract 返回值类型 方法名();

事实上,接口中的方法默认就是公有抽象方法,因此在接口中定义抽象方法时,可以省略掉abstract关键字

@.2从JDK8.0开始,接口中可以由默认方法和静态方法两种:

默认方法------public default 返回值类型 方法名(){ }

静态方法------public static 返回值类型 方法名(){ }

需要注意的是,想定义默认方法必须在前面添加 default关键字,因为接口中的方法如果你什么都不写,默认是公有的抽象的方法。默认方法可以有方法体,且不需要实现类去实现,其实就是我们平时见到的普通的成员方法。但是默认方法是可以被实现类重写的。default关键字只能在接口中使用,就算实现类要重写默认方法,实现类中重写后的方法也不能添加default修饰符,不然IDEA报错。

@.3JDK9.0以后,接口中可以有私有方法:

private 返回值类型 方法名(){ }

演示:

java 复制代码
package Test1;

// 定义一个接口
interface Animal {
    void eat(); // 接口中的方法默认是public abstract的
    void sleep();
}

// 实现接口的类
class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // 调用接口中的eat方法
        dog.sleep(); // 调用接口中的sleep方法
    }
}

运行结果:

注意:如果想使用默认方法,一定不要忘记添加default关键字。


3.接口构造方法的特点:

接口的存在的目的是为了规范类,因此,接口也不可以被实例化。接口中不允许存在代码块,也没有需要初始化的成员,因此接口没有构造方法(构造器)。在接口中定义构造器IDEA会直接报错,如下图:


4.接口创建对象的特点:

可以通过接口类型来引用实现接口的类的对象,从而实现多态性和灵活性。

例如:

java 复制代码
// 定义一个接口
interface Shape {
    double calculateArea(); // 计算面积的抽象方法
    double calculatePerimeter(); // 计算周长的抽象方法
}

// 实现接口的类:圆形
class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * Math.PI * radius;
    }
}

// 实现接口的类:矩形
class Rectangle implements Shape {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double calculateArea() {
        return length * width;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * (length + width);
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        System.out.println("Circle Area: " + circle.calculateArea());
        System.out.println("Circle Perimeter: " + circle.calculatePerimeter());

        Shape rectangle = new Rectangle(4, 6);
        System.out.println("Rectangle Area: " + rectangle.calculateArea());
        System.out.println("Rectangle Perimeter: " + rectangle.calculatePerimeter());
    }
}

运行结果:


5.接口继承关系的特点:

类和接口之间的关系 :

  • 类与接口是实现关系,支持"多实现",即一个类可实现多个接口。

接口与接口之间的关系 :

  • 接口与接口是继承关系,java 支持接口的多继承,即一个接口可以同时继承多个接口, 格式如下 :
  • 接口 extends 接口1,接口2,接口3...

继承和实现的区别 :

  • 继承体现的是"is a"的关系,父类中定义共性内容。
  • 实现体现的是"like a"的关系,父接口中定义扩展内容。

PS : 接口的"实现"可以看作是Java中对"单继承机制"的一个补充完善。接口可以在一定程度上实现代码解耦(接口规范性 + 动态绑定)。总的来看,接口的实现比类的继承更为灵活。


总结

  1. 接口定义了一组抽象方法的规范,实现接口的类必须提供这些方法的具体实现。
  2. 接口中的方法默认是public和abstract的,可以省略这些修饰符。
  3. 接口可以包含常量,这些常量默认是public、static和final的。
  4. 类可以实现一个或多个接口,使用关键字implements。
  5. 一个类可以同时继承一个类(单继承)并实现多个接口(多实现)。
  6. 接口之间可以进行继承,一个接口可以继承另一个接口,使用关键字extends。
  7. 接口不能被实例化,但可以通过实现接口的类来创建对象。
  8. 接口提供了一种规范化的方式来实现多态性,可以通过接口类型引用实现接口的类的对象。
相关推荐
Yan.love4 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶7 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥7 分钟前
java提高正则处理效率
java·开发语言
VBA633717 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~19 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳28 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it29 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
智慧老师38 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm39 分钟前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode