Java 教程
- Java - 首页
- Java - 概述
- Java - 历史
- Java - 特性
- Java 与 C++
- JVM - Java 虚拟机
- Java - JDK 与 JRE 与 JVM
- Java - Hello World 程序
- Java - 环境搭建
- Java - 基本语法
- Java - 变量类型
- Java - 数据类型
- Java - 类型转换
- Java - Unicode 系统
- Java - 基本运算符
- Java - 注释
- Java - 用户输入
- Java - 日期和时间
Java 控制语句
- Java - 循环控制
- Java - 决策制定
- Java - If-else
- Java - Switch
- Java - For 循环
- Java - For-Each 循环
- Java - While 循环
- Java - do-while 循环
- Java - Break
- Java - Continue
面向对象编程
- Java - OOPs 概念
- Java - 对象和类
- Java - 类属性
- Java - 类方法
- Java - 方法
- Java - 变量作用域
- Java - 构造函数
- Java - 访问修饰符
- Java - 继承
- Java - 聚合
- Java - 多态
- Java - 重写
- Java - 方法重载
- Java - 动态绑定
- Java - 静态绑定
- Java - 实例初始化块
- Java - 抽象
- Java - 封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java - 静态类
- Java - 匿名类
- Java - 单例类
- Java - 包装类
- Java - 枚举
- Java - 枚举构造函数
- Java - 枚举字符串
Java 内置类
Java 文件处理
Java 错误和异常
- Java - 异常
- Java - try-catch 块
- Java - try-with-resources
- Java - 多重捕获块
- Java - 嵌套 try 块
- Java - Finally 块
- Java - throw 异常
- Java - 异常传播
- Java - 内置异常
- Java - 自定义异常
Java 多线程
- Java - 多线程
- Java - 线程生命周期
- Java - 创建线程
- Java - 启动线程
- Java - 线程连接
- Java - 线程命名
- Java - 线程调度器
- Java - 线程池
- Java - 主线程
- Java - 线程优先级
- Java - 守护线程
- Java - 线程组
- Java - 关闭钩子
Java 同步
Java 网络
- Java - 网络
- Java - 套接字编程
- Java - URL 处理
- Java - URL 类
- Java - URLConnection 类
- Java - HttpURLConnection 类
- Java - Socket 类
- Java - 泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java - 命令行参数
- Java - Lambda 表达式
- Java - 发送邮件
- Java - Applet 基础
- Java - Javadoc 注释
- Java - 自动装箱和拆箱
- Java - 文件不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 文件
- Java - 私有接口方法
- Java - 内部类菱形运算符
- Java - 多分辨率图像 API
- Java - 集合工厂方法
- Java - 模块系统
- Java - Nashorn JavaScript
- Java - Optional 类
- Java - 方法引用
- Java - 函数式接口
- Java - 默认方法
- Java - Base64 编码解码
- Java - Switch 表达式
- Java - Teeing 收集器
- Java - 微基准测试
- Java - 文本块
- Java - 动态 CDS 归档
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指针异常
- Java - 打包工具
- Java - 密封类
- Java - 记录类
- Java - 隐藏类
- Java - 模式匹配
- Java - 简洁数字格式化
- Java - 垃圾回收
- Java - JIT 编译器
Java 杂项
- Java - 递归
- Java - 正则表达式
- Java - 序列化
- Java - 字符串
- Java - Process API 改进
- Java - Stream API 改进
- Java - 增强的 @Deprecated 注释
- Java - CompletableFuture API 改进
- Java - 流
- Java - 日期时间 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 和框架
Java 类参考
- Java - Scanner
- Java - 数组
- Java - 字符串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用资源
Java - 接口
Java 接口
Java 接口是抽象方法的集合。接口用于实现抽象,其中您可以定义方法而无需实现(无需方法体)。接口是一种引用类型,类似于类。
除了抽象方法外,接口还可以包含常量、默认方法、静态方法和嵌套类型。方法体仅存在于默认方法和静态方法中。
编写接口类似于编写类。但是,类描述了对象的属性和行为。接口包含类实现的行为。除非实现接口的类是抽象的,否则接口的所有方法都需要在类中定义。
Java 接口和类:异同
相似之处
接口在以下方面类似于类 -
接口可以包含任意数量的方法。
接口以.java扩展名写入文件,接口名称与文件名匹配。
接口的字节码出现在.class文件中。
接口出现在包中,其相应的字节码文件必须位于与包名称匹配的目录结构中。
区别
但是,接口在几个方面与类不同,包括 -
您不能实例化接口。
接口不包含任何构造函数。
接口中的所有方法都是抽象的。
接口不能包含实例字段。接口中可以出现的唯一字段必须同时声明为静态和最终的。
接口不是由类扩展的;它是类实现的。
接口可以扩展多个接口。
在 Java 中声明接口
interface关键字用于声明接口。以下是一个声明接口的简单示例 -
声明 Java 接口的示例
以下是一个接口示例 -
/* File name : NameOfInterface.java */ import java.lang.*; // Any number of import statements public interface NameOfInterface { // Any number of final, static fields // Any number of abstract method declarations\ }
Java 接口的属性
接口具有以下属性 -
接口隐式抽象。在声明接口时,您不需要使用abstract关键字。
接口中的每个方法也隐式抽象,因此不需要abstract关键字。
接口中的方法隐式为 public。
示例
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
在 Java 中实现接口
当一个类实现一个接口时,您可以将该类视为签署了一份合同,同意执行接口的特定行为。如果一个类没有执行接口的所有行为,则该类必须将自身声明为抽象类。
类使用implements关键字来实现接口。implements关键字出现在类声明中,位于声明的extends部分之后。
示例:在 Java 中实现接口
/* File name : MammalInt.java */ public class MammalInt implements Animal { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String args[]) { MammalInt m = new MammalInt(); m.eat(); m.travel(); } } interface Animal { public void eat(); public void travel(); }
输出
Mammal eats Mammal travels
定义 Java 接口中重写方法的规则
当重写接口中定义的方法时,需要遵循以下几个规则 -
除了接口方法声明或接口方法声明的子类之外,不应在实现方法上声明已检查的异常。
在重写方法时,应保持接口方法的签名和相同的返回类型或子类型。
实现类本身可以是抽象的,如果是这样,则不需要实现接口方法。
实现 Java 接口的规则
实现接口时,有以下几个规则 -
一个类可以同时实现多个接口。
一个类只能扩展一个类,但可以实现多个接口。
接口可以扩展另一个接口,就像类可以扩展另一个类一样。
扩展 Java 接口
接口可以扩展另一个接口,就像类可以扩展另一个类一样。extends关键字用于扩展接口,子接口继承父接口的方法。
示例:如何扩展 Java 接口
以下 Sports 接口被 Hockey 和 Football 接口扩展。
// Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } // Filename: Football.java public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } // Filename: Hockey.java public interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); }
Hockey 接口有四个方法,但它从 Sports 继承了两个;因此,实现 Hockey 的类需要实现所有六个方法。类似地,实现 Football 的类需要定义 Football 的三个方法和 Sports 的两个方法。
示例
interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); } public class HockeyDemo implements Hockey { public void setHomeTeam(String name) { System.out.println("Home team: " + name); } public void setVisitingTeam(String name) {} public void homeGoalScored() {} public void visitingGoalScored() {} public void endOfPeriod(int period) {} public void overtimePeriod(int ot) {} public static void main(String[] args) { Hockey hockeyDemo = new HockeyDemo(); hockeyDemo.setHomeTeam("India"); } }
输出
Home team: India
扩展多个 Java 接口
Java 类只能扩展一个父类。不允许多重继承。但是,接口不是类,一个接口可以扩展多个父接口。
extends 关键字只使用一次,并且父接口以逗号分隔的列表形式声明。
例如,如果 Hockey 接口扩展了 Sports 和 Event,则声明为 -
public interface Hockey extends Sports, Event
示例:如何扩展多个 Java 接口
interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); } interface Event { public void organize(); } public class HockeyDemo implements Hockey, Event { public void setHomeTeam(String name) { System.out.println("Home team: " + name); } public void setVisitingTeam(String name) {} public void homeGoalScored() {} public void visitingGoalScored() {} public void endOfPeriod(int period) {} public void overtimePeriod(int ot) {} public static void main(String[] args) { HockeyDemo hockeyDemo = new HockeyDemo(); hockeyDemo.setHomeTeam("India"); hockeyDemo.organize(); } public void organize() { System.out.println("Match organized. "); } }
输出
Home team: India Match organized.
标记 Java 接口
扩展接口最常见的用法是当父接口不包含任何方法时。例如,java.awt.event 包中的 MouseListener 接口扩展了 java.util.EventListener,其定义如下:
示例
package java.util; public interface EventListener {}
一个不包含任何方法的接口被称为标记接口。标记接口有两个基本的设计目的:
创建公共父类 - 与 EventListener 接口一样,它被 Java API 中的其他数十个接口扩展,您可以使用标记接口在接口组之间创建公共父类。例如,当一个接口扩展 EventListener 时,JVM 知道这个特定接口将用于事件委托场景。
为类添加数据类型 - 这种情况就是术语“标记”的来源。实现标记接口的类不需要定义任何方法(因为接口没有任何方法),但该类通过多态性成为接口类型。