📜  Java接口

📅  最后修改于: 2020-09-24 02:08:05             🧑  作者: Mango

Java接口

Java中的接口是类的蓝图。它具有静态常量和抽象方法。

Java中的接口是一种实现抽象的机制。Java接口中只能有抽象方法,而方法主体则不能。它用于在Java中实现抽象和多重继承。

换句话说,可以说接口可以具有抽象方法和变量。它不能具有方法主体。

Java接口还表示IS-A关系。

不能像抽象类一样实例化它。

从Java8开始,我们可以在接口中具有默认和静态方法。

从Java9开始,我们可以在接口中使用私有方法。

为什么要使用Java接口?

使用接口的主要原因主要有三个。它们在下面给出。

  • 它用于实现抽象。
  • 通过接口,我们可以支持多重继承的功能。
  • 它可用于实现松散耦合。

如何声明接口?

使用interface关键字声明接口。它提供了全面的抽象;表示接口中的所有方法都用空主体声明,并且默认情况下所有字段均为public,static和final。实现接口的类必须实现接口中声明的所有方法。

句法:

interface {  
          // declare constant fields  
    // declare methods that abstract   
    // by default.  
}  

Java 8接口改进

从Java8开始,接口可以具有默认方法和静态方法,这将在后面讨论。

编译器内部加法

Java编译器在接口方法之前添加了公共关键字和抽象关键字。此外,它在数据成员之前添加了public,static和final关键字。

换句话说,默认情况下,“接口”字段是公共的,静态的和最终的,而方法是公共的和抽象的。

类和接口之间的关系

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

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

输出:

Java接口示例:Drawable

在此示例中,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接口示例:银行

让我们看一下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());  
}}  

输出:

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

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

输出:

如您在上面的示例中看到的那样,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();  
 }  
}  

输出:

接口中的Java 8默认方法

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

输出:

接口中的Java 8静态方法

从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{  
}  

Java中的嵌套接口

注意:一个接口可以具有另一个称为嵌套接口的接口。我们将在嵌套类一章中详细学习它。例如:

interface printable{  
 void print();  
 interface MessagePrintable{  
   void msg();  
 }  
}