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的。

1.png

类和接口的关系

如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,但是一个类实现了一个接口

2.jpg

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 的接口,它只包含一个方法。RectangleCircle 类分别提供了该接口的实现。

在实际场景中,一个接口通常是由其他人定义的,但是它的具体实现由不同的实现提供者提供。而且,接口的使用者只需要关心接口的使用,对于实现部分是被隐藏的。

这种设计方式允许接口的用户通过接口来调用方法,而不需要关心具体的实现细节。这种解耦的设计方式使得接口的用户可以更灵活地使用接口,并且在接口的实现发生变化时不会受到影响。

文件: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中的接口多重继承

如果一个类实现了多个接口,或者一个接口扩展了多个接口,则称为多重继承。

3.jpg

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();  
 }  
}  

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想