Java接口

1 什么Java接口

Java中的接口是类的蓝图。接口包含静态常量和抽象方法。

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

  • Java接口还表示IS-A关系。
  • 与抽象类类似,Java接口也是不能实例化的。
  • 从Java 8开始,我们可以在接口中使用默认方法和静态方法。
  • 从Java 9开始,我们可以在接口中使用私有方法。

2 为什么要使用Java接口

使用接口的主要原因主要有以下三个:

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

3 如何定义接口

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

interface <interface_name>{  
      
    // 声明常量字段  
    // 声明抽象方法  
  
}  

4 编译器编译接口的细节

Java编译器在编译接口的时候,在接口所有方法之前自动添加了public关键字和abstract关键字。此外,它在字段之前也自动添加了public,static和final关键字。

换句话说,默认情况下,接口的所有字段是public,static和final,而方法是public和abstract的。

5 类和接口的关系

如下图所示,一个类继承另一个类,一个接口继承另一个接口,但是一个类可以实现接口。

6 Java接口的示例:Printable

在本示例中,Printable接口只有一个方法,并且其实现在A6类中提供。

/**
 * 一点教程网 - http://www.yiidian.com
 */
interface printable{
    void print();
}
class A6 implements printable{
    public void print(){
        System.out.println("你好");
    }

    public static void main(String args[]){
        A6 obj = new A6();
        obj.print();
    }
}  

输出结果为:

你好

7 Java接口的示例:Drawable

在本示例中,Drawable接口只有一个方法。它的实现由Rectangle和Circle类提供。在实际情况下,接口是由其他人定义的,但是其实现是由不同的实现提供程序提供的。而且,它被其他人使用。使用该接口的用户将实现部分隐藏起来。

TestInterface1.java:

/**
 * 一点教程网 - http://www.yiidian.com
 */
//接口声明
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();
    }
}

输出结果为:

绘制圆形

8 Java接口的示例:Bank

让我们看一下Java接口的另一个示例,该示例提供Bank接口的实现。

TestInterface2.java:

/**
 * 一点教程网 - http://www.yiidian.com
 */
interface Bank{
    float rateOfInterest();
}
class ICBC implements Bank{
    public float rateOfInterest(){return 9.15f;}
}
class CCB implements Bank{
    public float rateOfInterest(){return 9.7f;}
}
class TestInterface2{
    public static void main(String[] args){
        Bank b=new ICBC();
        System.out.println("贷款利率为: "+b.rateOfInterest());
    }
}

输出结果为:

贷款利率为: 9.15

9 Java接口继承

一个类实现一个接口,但是一个接口继承另一个接口。

/**
 * 一点教程网 - http://www.yiidian.com
 */
interface Printable{
    void print();
}
interface Showable extends Printable{
    void show();
}
class TestInterface4 implements Showable{
    public void print(){
        System.out.println("你好");
    }
    public void show(){
        System.out.println("欢迎");
    }

    public static void main(String args[]){
        TestInterface4 obj = new TestInterface4();
        obj.print();
        obj.show();
    }
}

输出结果为:

你好
欢迎

10 Java接口的多重继承

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

/**
 * 一点教程网 - http://www.yiidian.com
 */
interface Printable{
    void print();
}
interface Showable extends Printable{
    void show();
}
class TestInterface4 implements Showable{
    public void print(){
        System.out.println("你好");
    }
    public void show(){
        System.out.println("欢迎");
    }

    public static void main(String args[]){
        TestInterface4 obj = new TestInterface4();
        obj.print();
        obj.show();
    }
}

输出结果为:

你好
欢迎

11 为什么类不支持多重继承,接口支持多重继承

正如我们在继承章节中所讲的,由于类的歧义,Java的类是不支持多重继承的。但是,Java的接口是支持多重继承,这是因为接口的实现是由实现类提供的,不存在歧义的问题。例如:

/**
 * 一点教程网 - http://www.yiidian.com
 */
interface Printable{
    void print();
}
interface Showable{
    void print();
}

class TestInterface3 implements Printable, Showable{
    public void print(){
        System.out.println("你好");
    }
    public static void main(String args[]){
        TestInterface3 obj = new TestInterface3();
        obj.print();
    }
}

输出结果为:

你好

上面的示例中我们可以看到,Printable和Showable接口拥有相同的方法,但其实现由TestTnterface1提供,因此没有歧义。

12 Java8接口的默认方法

从Java 8开始,我们可以在接口中存在方法实现。但是我们需要将其设置为默认方法。让我们来看一个例子:

TestInterfaceDefault.java:

/**
 * 一点教程网 - http://www.yiidian.com
 */
interface Drawable{
    void draw();
    default void msg(){
        System.out.println("默认方法");
    }
}
class Rectangle implements Drawable{
    public void draw(){
        System.out.println("绘制长方形");
    }
}
class TestInterfaceDefault{
    public static void main(String args[]){
        Drawable d=new Rectangle();
        d.draw();
        d.msg();
    }
}

输出结果为:

绘制长方形
默认方法

13 Java8接口的静态方法

从Java 8开始,我们可以在接口中使用静态方法。让我们来看一个例子:

TestInterfaceStatic.java:

/**
 * 一点教程网 - http://www.yiidian.com
 */
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

14 什么是标记接口

没有任何成员(字段或者方法)的接口称为标记接口,例如Serializable,Cloneable,Remote等。它们用于向JVM提供一些基本信息,以便JVM可以执行一些有用的操作。

//所有需要序列化的对象都必须实现Serializable接口
public interface Serializable{  
}  

 

推荐好课