Java 接口(interface)

本文详细介绍了Java接口的概念、语法结构、实现方式以及Java8引入的默认方法和静态方法。强调了接口作为契约的重要性,以及如何通过接口实现多继承和代码解耦。此外,还探讨了标记接口的作用以及使用接口的意义。
摘要由CSDN通过智能技术生成

Java 接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同地方被实现,而这些实现可以具有不同的行为。

关于接口

Java 接口有特定的语法和结构,以 interface 来声明。它与类相似,但有不同的概念。

①、接口的声明

public interface MyInterface {
	//变量与抽象方法
}

②、接口的特征

  • 没有构造方法,不能被实例化。
  • 接口中的变量被隐式的指定为 public static final 变量。
  • 接口中的抽象方法被隐式的指定为 public abstract 方法。
  • 接口中的方法都是抽象的。Java 8 之后可以有默认方法静态方法,Java 9 之后可以将方法定义为 private
  • 接口之间允许多继承,使用 extends 关键字。

简单来说就是接口只允许有 public static final 修饰的变量、public abstract 修饰的方法。Java 8 之后可以有默认方法和静态方法。

③、接口中的隐式声明

一般情况下,我们可能在接口中这样定义变量和方法:

public interface MyInterface {

    String name = "张三";
    
    void abstractMethod();
}

实际上,接口中的变量被隐式指定为 public static final 变量,抽象方法被隐式指定为 public abstract 方法。

如果不遵守接口中的规则,则编译报错。如:变量没有初始化;显示指定变量、抽象方法非 public 访问修饰符。


注意: 接口文件保存在 .java 结尾的文件中,文件名使用接口名。接口的字节码文件保存在 .class 结尾的文件中。



接口的实现

类使用 implements 关键字实现接口

public class InterfaceDemon implements MyInterface1,MyInterface2{
    @Override
    public void abstractMethod() {
		System.out.println("重写方法");
		//throw new Exception("实现类中抛出异常"); //编译不通过
		
    }
}

//接口1
interface MyInterface1{
    void abstractMethod();
}
//接口2
interface MyInterface2{
    
}

实现接口的规则:

  • 一个类可以实现多个接口
  • 一个类实现接口时,必须实现接口中的所有抽象方法。否则,该类为抽象类。
  • 类在实现接口方法时,不能抛出强制性异常。
  • 类中的实现方法必须与接口中的方法保持一致。包括:访问修饰符、返回类型(可以是子类型)、方法名、参数列表。


Java 8 新特性

Java 8 之后,接口中可以使用默认方法静态方法

①、默认方法

默认方法的创建: 方法名前面加 default 关键字

public interface MyInterface {

    default void defaultMethod(){
        System.out.println("默认方法");
    }
}

默认方法的调用: 默认方法只能通过它的子类实例调用

public class InterfaceDemon {
    public static void main(String[] args) {
        Subclass b = new Subclass(); //创建子类
        b.defaultMethod(); //调用默认方法
    }
}

//接口
interface MyInterface{
    default void defaultMethod(){
        System.out.println("默认方法");
    }
}

//子类
class Subclass implements MyInterface{
    
}

多个默认方法冲突问题

如果多个接口实现了相同的默认方法,并且一个类同时实现了这些接口,那么实现类必须重写该默认方法,否则编译报错。

public class InterfaceDemon {
    public static void main(String[] args) {
        Subclass b = new Subclass();
        b.defaultMethod();

    }
}

//接口1
interface MyInterface1{
    default void defaultMethod(){
        System.out.println("默认方法");
    }

    
}

//接口2
interface MyInterface2{
    default void defaultMethod(){
        System.out.println("默认方法");
    }
}

//子类
class Subclass implements MyInterface1,MyInterface2{
    @Override
    public void defaultMethod() { //重写方法
        MyInterface2.super.defaultMethod();//指定具体接口的默认方法
        System.out.println("子类的重写方法"); 
    }
}

Java 8 接口中为什么要加入默认方法

默认方法的加入主要为了解决现有接口的修改导致实现类兼容问题。在开发过程中,如果一个接口有多个实现类,而当修改接口的时候,所有的实现类都要修改,而事实是只有部分接口需要,这就导致了代码耦合性高,维护难度大。而默认方法是可选的,需要的子类自行使用,不影响其他子类。同时,不同子类还可以重写默认方法实现不同需求。

②、静态方法

静态方法的创建: 方法加上 static 关键字

public interface MyInterface{
    
    static void staticMethod(){
        System.out.println("静态方法");
    }
}

静态方法的调用: 只能通过接口名调用

public class InterfaceDemon {
    public static void main(String[] args) {
        MyInterface.staticMethod();

    }
}

//接口
interface MyInterface{
    
    static void staticMethod(){
        System.out.println("静态方法");
    }
}

关于静态方法

1、接口的静态方法属于接口,不能通过子类调用,不能重写。

2、接口中可以定义静态方法意味着接口可以取代 Java 中的工具类。如 CollectionsArrays 等。



标记接口

标记接口(Marker Interface)是没有任何方法和属性的接口,它仅仅表示实现该接口的类属于一个特定类型,可以做一些特定的事。

Java 中标记接口例子:

  • java.io.Serializable:实现该接口的类可以进行序列化。序列化类必须声明一个 serialVersionUID值。
  • java.lang.Cloneable:实现该接口的类应该重新 Object.clone 方法,此方法可以对该类实例进行复制。
  • java.util.RandomAccess:实现此接口的类表明支持快速随机访问。
  • java.rmi.Remote:实现此接口的类用于标识其方法可以从本地虚拟机上调用接口。


使用接口的意义

接口是比抽象类更加抽象的一种抽象类型,它自身不能做更多事,而是代表一种规则约束。同时,接口是一个能使类轻易具有多种类型的工具。

在开发过程中,接口为代码的编写提供了一种准则,这使得各个类的功能更加明确、代码耦合度低、易维护。但这对接口编写的稳定性要求较高,否则修改接口会影响其他无关实现类。而在继承关系上,它弥补了类不能多继承的缺陷,使得继承关系更加灵活。

因为 Java 8 接口加入了默认方法和静态方法,使得接口与抽象类功能更加相似,而这也更好的解决了接口的修改导致实现类兼容问题。




——THE END——

相关文章: Java 抽象类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值