Java 接口

文章正文
发布时间:2025-06-29 12:57

Java 接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

接口与类相似点:

一个接口可以有多个方法。

接口文件保存在 .java 结尾的文件中,文件名使用接口名。

接口的字节码文件保存在 .class 结尾的文件中。

接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:

接口不能用于实例化对象。

接口没有构造方法。

接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。

接口不能包含成员变量,除了 static 和 final 变量。

接口不是被类继承了,而是要被类实现。

接口支持多继承。

接口特性

接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。

接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。

接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别

1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

:JDK 1.8 以后,接口里可以有静态方法和方法体了。

:JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。更多内容可参考 Java 8 默认方法。

:JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。更多内容可参考 Java 9 私有接口方法。

接口的声明

接口的声明语法格式如下:

[可见度]interface 接口名称 [extends 其他的接口名]{// 声明变量// 抽象方法}

Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。

NameOfInterface.java 文件代码:

/* 文件名 : NameOfInterface.java */importjava.lang.*; //引入包publicinterfaceNameOfInterface{//任何类型 final, static 字段//抽象方法}

接口有以下特性:

接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。

接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。

接口中的方法都是公有的。

实例

Animal.java 文件代码:

/* 文件名 : Animal.java */interfaceAnimal{publicvoideat(); publicvoidtravel(); }

接口的实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

实现一个接口的语法,可以使用这个公式:

接口语法:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

实例

MammalInt.java 文件代码:

/* 文件名 : MammalInt.java */publicclassMammalIntimplementsAnimal{publicvoideat(){System.out.println("Mammal eats"); }publicvoidtravel(){System.out.println("Mammal travels"); }publicintnoOfLegs(){return0; }publicstaticvoidmain(Stringargs[]){MammalIntm = newMammalInt(); m.eat(); m.travel(); }}

以上实例编译运行结果如下:

Mammal eats Mammal travels

重写接口中声明的方法时,需要注意以下规则:

类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。

类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。

如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

在实现接口的时候,也要注意一些规则:

一个类可以同时实现多个接口。

一个类只能继承一个类,但是能实现多个接口。

一个接口能继承另一个接口,这和类之间的继承比较相似。

接口的继承

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

下面的Sports接口被Hockey和Football接口继承:

// 文件名: Sports.javapublicinterfaceSports{publicvoidsetHomeTeam(Stringname); publicvoidsetVisitingTeam(Stringname); }// 文件名: Football.javapublicinterfaceFootballextendsSports{publicvoidhomeTeamScored(intpoints); publicvoidvisitingTeamScored(intpoints); publicvoidendOfQuarter(intquarter); }// 文件名: Hockey.javapublicinterfaceHockeyextendsSports{publicvoidhomeGoalScored(); publicvoidvisitingGoalScored(); publicvoidendOfPeriod(intperiod); publicvoidovertimePeriod(intot); }

Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。

相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口。

接口的多继承

在Java中,类的多继承是不合法,但接口允许多继承。

在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

publicinterfaceHockeyextendsSports, Event

以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports及 Event 可以定义或是继承相同的方法

标记接口

最常用的标记接口是没有包含任何方法的接口。

标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

packagejava.util; publicinterfaceEventListener{}

没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:

建立一个公共的父接口:

正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

向一个类添加数据类型:

这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

AI 思考中...

Java 封装

Java 包(package)

9 篇笔记 写笔记

#0

fang

442***949@qq.com

159

1.接口可以多继承

2.接口的方法声明必须是 public abstract 即便不写默认也是

3.接口里面不能包含方法具体实现

4.类实继承接口必须实现接口里申明的全部方法,除非该类是抽象类

5.类里面可以声明 public static final 修饰的变量

6.接口不能被实例化,但是可以被实现类创建

fang

442***949@qq.com

8年前 (2017-05-23)

#0

走刀口

805***264@qq.com

109

什么时候使用抽象类和接口

如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。

如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。

如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

走刀口

805***264@qq.com

8年前 (2017-10-23)

#0

怀念那些快乐

add***lltree@163.com

86

在 JDK1.8,允许我们给接口添加两种非抽象的方法实现:

1、默认方法,添加 default 修饰即可;

2、静态方法,使用 static 修饰;示例如下:

interface Test{ //这个是默认方法 default String get(String aa){ System.out.println("我是jdk1.8默认实现方法..."); return ""; } //这个是静态方法 static void staticmethod(){ System.out.println("我是静态方法"); } }

调用得话,静态方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,default 方法只能通过接口实现类的对象来调用。

怀念那些快乐

add***lltree@163.com

8年前 (2018-01-11)

#0

赤色星空

531***371@qq.com

73

接口的含义理解

接口可以理解成统一的协议, 而接口中的属性也属于协议中的内容。但是接口的属性都是公共的,静态的,最终的。

接口的成员特点:

1、成员变量只能是常量,默认修饰符 public static final

2、成员方法只能是抽象方法。默认修饰符 public abstract

所以,Java 接口中,使用变量的时候,变量必须被赋值。

//所以接口定义属性 public interface People { int age=10; String; // 接口里面定义的成员变量都是 public static final 修饰 public void eat();   }

所有的变量必须给出初始值,且绝对不会被修改,因为隐藏的修饰符为 public static final。

赤色星空

531***371@qq.com

7年前 (2018-06-27)

#0

Xander663

xan***1998@163.com

  参考地址

43

Java 标识接口

标识接口是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

使用标记接口的唯一目的是使得可以用 instanceof 进行类型查询,例如:

if(obj instanceof Cloneable) {………}

一些容器例如 Ejb 容器,servlet 容器或运行时环境依赖标记接口识别类是否需要进行某种处理,比如 serialialbe 接口标记类需要进行序列化操作。

java.io.Serializable:未实现此接口的类将无法使其任何状态序列化或反序列化。为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。

java.lang.Cloneable:表明 Object.clone() 方法可以合法地对该类实例进行按字段复制.实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。

java.util.RandomAccess:用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

java.rmi.Remote:Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。

Xander663

Xander663

xan***1998@163.com

  参考地址

7年前 (2018-07-15)

#0

Xander663

xan***1998@163.com

  参考地址

33

接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。这其实是通过接口实现多态的关键。

interface Fu { public abstract void method(); } class Zi implements Fu { public void method(){ System.out.println(“重写接口抽象方法”); } } //接口的多态使用 Fu fu = new Zi();

更多内容参考:Java 接口和多态

Xander663

xan***1998@163.com

  参考地址

7年前 (2018-07-15)

#0

Luochy

luo***ngyou_100@163.com

41

Java 抽象类和接口总结

1、abstract classJava 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个 interface

2.在 abstract class 中可以有自己的数据成员,也可以有非 abstarct 的成员方法,而在 interface 中,只能够有静态的不能被修改的数据成员(也就是必须是 static final 的,不过在 interface 中一般不定义数据成员),所有的成员方法都是 abstract 的。

3.abstract classinterface 所反映出的设计理念不同。其实 abstract class 表示的是 "is-a" 关系,interface 表示的是 "has-a" 关系。

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是 public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public,abstract 类型的。

结论: abstract classinterface 是 Java 语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概 念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。

Luochy

Luochy

luo***ngyou_100@163.com

7年前 (2018-07-31)

#0

Cheese

365***474@qq.com

  参考地址

82

接口更加简易的理解:

//USB接口 interface USB { void read(); void write(); } // 这是U盘的具体实现。 class YouPan implements USB { @Override public void read() { System.out.println("U盘正在通过USB功能读取数据"); } @Override public void write() { System.out.println("U盘正在通过USB功能写入数据"); } }

Cheese

365***474@qq.com

  参考地址

5年前 (2020-05-15)

#0

一只小笼猫

min***ukiryuse@outlook.com

44

接口的默认方法、静态方法实现的一点补充。

//定义一个接口 public interface Inter { void show(); //抽象方法 default void method() { //默认方法 System.out.println("默认方法被实现了"); } static void test(){ //静态方法 System.out.println("静态方法被实现了"); } } //定义接口的一个实现类 public class Interlmpl implements Inter { @Override public void show() { System.out.println("show方法"); } } //定义测试类 public class InterDemo { public static void main(String[] args) { Inter i = new Interlmpl(); i.show(); //抽象方法强制被重写 i.method(); //默认方法不强制被重写,但可以被重写,重写时去掉default关键字 Inter.test(); //静态方法只能通过接口名调用,不能通过实现类名或者对象名调用 } }

一只小笼猫

min***ukiryuse@outlook.com

4年前 (2021-09-02)

首页
评论
分享
Top