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
中的工具类。如 Collections
、Arrays
等。
标记接口
标记接口(Marker Interface)是没有任何方法和属性的接口,它仅仅表示实现该接口的类属于一个特定类型,可以做一些特定的事。
Java 中标记接口例子:
java.io.Serializable
:实现该接口的类可以进行序列化。序列化类必须声明一个serialVersionUID
值。java.lang.Cloneable
:实现该接口的类应该重新Object.clone
方法,此方法可以对该类实例进行复制。java.util.RandomAccess
:实现此接口的类表明支持快速随机访问。java.rmi.Remote
:实现此接口的类用于标识其方法可以从本地虚拟机上调用接口。
使用接口的意义
接口是比抽象类更加抽象的一种抽象类型,它自身不能做更多事,而是代表一种规则约束。同时,接口是一个能使类轻易具有多种类型的工具。
在开发过程中,接口为代码的编写提供了一种准则,这使得各个类的功能更加明确、代码耦合度低、易维护。但这对接口编写的稳定性要求较高,否则修改接口会影响其他无关实现类。而在继承关系上,它弥补了类不能多继承的缺陷,使得继承关系更加灵活。
因为 Java 8 接口加入了默认方法和静态方法,使得接口与抽象类功能更加相似,而这也更好的解决了接口的修改导致实现类兼容问题。
——THE END——
相关文章: Java 抽象类