Java教程-详解 Java 接口

Java 中的接口有静态常量和抽象方法。
在 Java 中,接口是一种实现抽象的机制。接口包含静态常量和抽象方法。
接口中的方法都是抽象的,不能有方法体。它用于实现 Java 中的抽象和多重继承的功能。
换句话说,可以说接口可以包含抽象方法和常量,但不能包含具体的方法实现。
接口还表示了 IS-A(是一个)关系。
接口不能像抽象类一样被实例化。
从 Java 8 开始,接口中引入了默认方法和静态方法的概念。
从 Java 9 开始,接口中还可以包含私有方法。
为什么要使用 Java 接口?
使用接口主要有三个原因,它们如下:
- 实现抽象:接口提供了一种完全抽象的方式,所有方法都被声明为空主体,字段默认为 public、static 和 final。实现接口的类必须实现接口中声明的所有方法。
- 多重继承:通过接口,Java 支持了多重继承的功能,一个类可以实现多个接口。
- 松耦合:接口提供了一种松耦合的设计方式,使得类与接口之间的依赖关系更加灵活。
如何声明接口?
使用关键字 interface
来声明接口。接口中的方法默认为抽象的,表示方法没有具体的实现。接口中的字段默认为 public、static 和 final。实现接口的类必须实现接口中声明的所有方法。
句法:
interface <interface_name>{
// 声明常量字段
// 声明抽象的方法
// 默认情况下。
}
Java 8 接口改进
从Java 8开始,接口可以有默认方法和静态方法,这将在后面讨论。
编译器内部添加
Java 编译器在接口方法之前添加 public 和 abstract 关键字。此外,它在数据成员之前添加了 public、static 和 final 关键字。
也就是说,接口字段默认是public、static和final的,方法是public和abstract的。
类和接口的关系
如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,但是一个类实现了一个接口。
Java 接口示例
在此示例中,Printable 接口只有一个方法,其实现在 A6 类中提供。
interface printable{
void print();
}
class A6 implements printable{
public void print(){System.out.println("Hello");}
public static void main(String args[]){
A6 obj = new A6();
obj.print();
}
}
输出:
Hello
Java 接口示例:Drawable
在这个例子中,我们有一个名为 Drawable
的接口,它只包含一个方法。Rectangle
和 Circle
类分别提供了该接口的实现。
在实际场景中,一个接口通常是由其他人定义的,但是它的具体实现由不同的实现提供者提供。而且,接口的使用者只需要关心接口的使用,对于实现部分是被隐藏的。
这种设计方式允许接口的用户通过接口来调用方法,而不需要关心具体的实现细节。这种解耦的设计方式使得接口的用户可以更灵活地使用接口,并且在接口的实现发生变化时不会受到影响。
文件:TestInterface1.java
//接口声明:由第一个用户
interface Drawable{
void draw();
}
//实现:由第二个用户
class Rectangle implements Drawable{
public void draw(){System.out.println("绘图矩形");}
}
class Circle implements Drawable{
public void draw(){System.out.println("绘图圆形");}
}
//使用接口:第三个用户
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();//在实际场景中,对象是由方法提供的,例如getDrawable()
d.draw();
}}
输出:
绘图圆形
Java 接口示例:银行
让我们看另一个提供 Bank 接口实现的 java 接口示例。
文件:TestInterface2.java
interface Bank{
float rateOfInterest();
}
class SBI implements Bank{
public float rateOfInterest(){return 9.15f;}
}
class PNB implements Bank{
public float rateOfInterest(){return 9.7f;}
}
class TestInterface2{
public static void main(String[] args){
Bank b=new SBI();
System.out.println("ROI: "+b.rateOfInterest());
}}
输出:
ROI: 9.15
Java中的接口多重继承
如果一个类实现了多个接口,或者一个接口扩展了多个接口,则称为多重继承。
interface Printable{
void print();
}
interface Showable{
void show();
}
class A7 implements Printable,Showable{
public void print(){System.out.println("Hello");}
public void show(){System.out.println("Welcome");}
public static void main(String args[]){
A7 obj = new A7();
obj.print();
obj.show();
}
}
输出:
Hello
Welcome
Q) Java 中的类不支持多重继承,但接口可以,为什么?
正如我们在继承章节中解释的那样,由于歧义,在类的情况下不支持多重继承。但是,在接口的情况下支持它,因为没有歧义。因为它的实现是由实现类提供的。例如:
interface Printable{
void print();
}
interface Showable{
void print();
}
class TestInterface3 implements Printable, Showable{
public void print(){System.out.println("Hello");}
public static void main(String args[]){
TestInterface3 obj = new TestInterface3();
obj.print();
}
}
输出:
Hello
正如您在上面的示例中看到的,Printable 和 Showable 接口具有相同的方法,但其实现由类 TestTnterface1 提供,因此没有歧义。
接口继承
一个类实现了一个接口,但是一个接口扩展了另一个接口。
interface Printable{
void print();
}
interface Showable extends Printable{
void show();
}
class TestInterface4 implements Showable{
public void print(){System.out.println("Hello");}
public void show(){System.out.println("Welcome");}
public static void main(String args[]){
TestInterface4 obj = new TestInterface4();
obj.print();
obj.show();
}
}
输出:
Hello
Welcome
接口中的 Java 8 默认方法
从 Java 8 开始,我们可以在接口中包含方法体。但是我们需要让它成为默认方法。让我们看一个例子:
文件:TestInterfaceDefault.java
interface Drawable{
void draw();
default void msg(){System.out.println("default method");}
}
class Rectangle implements Drawable{
public void draw(){System.out.println("drawing rectangle");}
}
class TestInterfaceDefault{
public static void main(String args[]){
Drawable d=new Rectangle();
d.draw();
d.msg();
}}
输出:
drawing rectangle
default method
接口中的 Java 8 静态方法
从 Java 8 开始,我们可以在接口中使用静态方法。让我们看一个例子:
文件:TestInterfaceStatic.java
interface Drawable{
void draw();
static int cube(int x){return x*x*x;}
}
class Rectangle implements Drawable{
public void draw(){System.out.println("绘图矩形");}
}
class TestInterfaceStatic{
public static void main(String args[]){
Drawable d=new Rectangle();
d.draw();
System.out.println(Drawable.cube(3));
}}
输出:
绘制矩形
27
Q) 什么是标记或标记接口?
没有成员的接口称为标记接口或标记接口,例如,Serializable、Cloneable、Remote 等。它们用于向 JVM 提供一些基本信息,以便 JVM 可以执行一些有用的操作。
//Serializable接口是怎么写的?
public interface Serializable{
}
Java 中的嵌套接口
注意:一个接口可以有另一个接口,称为嵌套接口。我们将在嵌套类章节中详细学习。例如:
interface printable{
void print();
interface MessagePrintable{
void msg();
}
}