📅  最后修改于: 2020-09-24 02:08:05             🧑  作者: Mango
Java中的接口是类的蓝图。它具有静态常量和抽象方法。
Java中的接口是一种实现抽象的机制。Java接口中只能有抽象方法,而方法主体则不能。它用于在Java中实现抽象和多重继承。
换句话说,可以说接口可以具有抽象方法和变量。它不能具有方法主体。
Java接口还表示IS-A关系。
不能像抽象类一样实例化它。
从Java8开始,我们可以在接口中具有默认和静态方法。
从Java9开始,我们可以在接口中使用私有方法。
使用接口的主要原因主要有三个。它们在下面给出。
使用interface关键字声明接口。它提供了全面的抽象;表示接口中的所有方法都用空主体声明,并且默认情况下所有字段均为public,static和final。实现接口的类必须实现接口中声明的所有方法。
interface {
// declare constant fields
// declare methods that abstract
// by default.
}
从Java8开始,接口可以具有默认方法和静态方法,这将在后面讨论。
Java编译器在接口方法之前添加了公共关键字和抽象关键字。此外,它在数据成员之前添加了public,static和final关键字。
换句话说,默认情况下,“接口”字段是公共的,静态的和最终的,而方法是公共的和抽象的。
如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,但是一个类实现了一个接口。
在此示例中,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();
}
}
输出:
在此示例中,Drawable接口只有一种方法。它的实现由Rectangle和Circle类提供。在实际情况下,接口是由其他人定义的,但是其实现是由不同的实现提供程序提供的。而且,它被其他人使用。使用该接口的用户将实现部分隐藏起来。
文件:TestInterface1.java
//Interface declaration: by first user
interface Drawable{
void draw();
}
//Implementation: by second user
class Rectangle implements Drawable{
public void draw(){System.out.println("drawing rectangle");}
}
class Circle implements Drawable{
public void draw(){System.out.println("drawing circle");}
}
//Using interface: by third user
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();//In real scenario, object is provided by method e.g. getDrawable()
d.draw();
}}
输出:
让我们看一下Java接口的另一个示例,该示例提供Bank接口的实现。
文件: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());
}}
输出:
如果一个类实现多个接口,或者一个接口扩展了多个接口,则称为多重继承。
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();
}
}
正如我们在继承一章中所解释的,由于类的含糊,在类的情况下不支持多重继承。但是,由于没有歧义,因此在接口的情况下受支持。这是因为其实现是由实现类提供的。例如:
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();
}
}
输出:
如您在上面的示例中看到的那样,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();
}
}
输出:
从Java8开始,我们可以在接口中具有方法主体。但是我们需要将其设为默认方法。让我们来看一个例子:
文件: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();
}}
输出:
从Java8开始,我们可以在接口中使用静态方法。让我们来看一个例子:
文件: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("drawing rectangle");}
}
class TestInterfaceStatic{
public static void main(String args[]){
Drawable d=new Rectangle();
d.draw();
System.out.println(Drawable.cube(3));
}}
输出:
没有成员的接口称为标记或标记接口,例如Serializable,Cloneable,Remote等。它们用于向JVM提供一些基本信息,以便JVM可以执行一些有用的操作。
//How Serializable interface is written?
public interface Serializable{
}
注意:一个接口可以具有另一个称为嵌套接口的接口。我们将在嵌套类一章中详细学习它。例如:
interface printable{
void print();
interface MessagePrintable{
void msg();
}
}