📜  Java接口Interfaces

📅  最后修改于: 2020-04-05 11:48:32             🧑  作者: Mango

像类一样,接口可以具有方法和变量,但是默认情况下,接口中声明的方法是抽象的(仅方法签名,没有主体)。  

  • 接口指定类必须执行的操作,而不指定方法。这是该类的蓝图。
  • 接口是关于功能的,例如Player可能是接口,任何实现Player的类都必须能够(或必须实现)move()。因此,它指定了类必须实现的一组方法。
  • 如果一个类实现一个接口,并且不为该接口中指定的所有功能提供方法主体,则该类必须声明为抽象的。
  • 一个Java库示例是Comparator Interface。如果一个类实现了此接口,则可以使用它对集合进行排序。

语法 :

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

要声明接口,请使用interface关键字。它用于提供总体抽象。这意味着默认情况下,接口中的所有方法都以空主体声明并且是公共的,并且所有字段都是公共的,静态的和最终的。实现接口的类必须实现接口中声明的所有方法。要实现接口,请使用Implements关键字。
我们为什么要使用接口interface?

  • 它用于实现整体抽象。
  • 由于Java在类的情况下不支持多重继承,但是通过使用接口,它可以实现多重继承。
  • 它还用于实现松散耦合。
  • 接口用于实现抽象。因此出现了一个问题,当我们有抽象类时为什么要使用接口?原因是,抽象类可能包含非最终变量,而接口中的变量是最终变量,公共变量和静态变量。
    // 一个简单的接口 interface
    interface Player
    {
        final int id = 10;
        int move();
    }

     

要实现一个接口,我们使用关键字interface:

// Java展示接口interface.
import java.io.*;
// 一个简单的接口
interface In1
{
    // public, static and final
    final int a = 10;
    // public and abstract
    void display();
}
// 一个实现接口的类
class TestClass implements In1
{

    public void display()
    {
        System.out.println("芒果");
    }
    // 测试代码
    public static void main (String[] args)
    {
        TestClass t = new TestClass();
        t.display();
        System.out.println(a);
    }
}

输出:

芒果
10

一个真实的示例:
让我们以自行车,汽车,自行车…等车辆为例,它们具有共同的功能。因此,我们制作了一个接口并放置了所有这些通用功能。并让Bicycle,Bike,car….etc等以自己的方式在自己的类中实现所有这些功能。

import java.io.*;
interface Vehicle {
    // 抽象方法
    void changeGear(int a);
    void speedUp(int a);
    void applyBrakes(int a);
}
class Bicycle implements Vehicle{
    int speed;
    int gear;
     // 改变档位
    @Override
    public void changeGear(int newGear){
        gear = newGear;
    }
    // 加速
    @Override
    public void speedUp(int increment){
        speed = speed + increment;
    }
    // 减速
    @Override
    public void applyBrakes(int decrement){
        speed = speed - decrement;
    }
    public void printStates() {
         System.out.println("速度: " + speed
              + " 档位: " + gear);
    }
}
class Bike implements Vehicle {
    int speed;
    int gear;
    // 换挡
    @Override
    public void changeGear(int newGear){
        gear = newGear;
    }
    // 加速
    @Override
    public void speedUp(int increment){
        speed = speed + increment;
    }
    // 减速
    @Override
    public void applyBrakes(int decrement){
        speed = speed - decrement;
    }
    public void printStates() {
         System.out.println("速度: " + speed
             + " 档位: " + gear);
    }
}
class GFG {
    public static void main (String[] args) {
        // 创建一个Bicycle对象
        Bicycle bicycle = new Bicycle();
        bicycle.changeGear(2);
        bicycle.speedUp(3);
        bicycle.applyBrakes(1);
        System.out.println("Bicycle当前状态 :");
        bicycle.printStates();
        // creating instance of the bike.
        Bike bike = new Bike();
        bike.changeGear(1);
        bike.speedUp(4);
        bike.applyBrakes(3);
        System.out.println("Bike当前状态 :");
        bike.printStates();
    }
}

输出;

Bicycle当前状态 :
速度: 2 档位: 2
Bike当前状态 :
速度: 1 档位: 1

JDK 8中的接口中添加了新功能

  1. 在JDK 8之前,接口无法定义实现。现在,我们可以为接口方法添加默认实现。此默认实现具有特殊用途,并且不会影响接口的意图。假设我们需要在现有接口中添加新功能。显然,旧代码将无法使用,因为类尚未实现这些新功能。因此,借助默认实现,我们将为新添加的函数提供默认主体。这样旧的代码仍然可以使用。
    // Java展示JDK 8中的接口中添加新功能
    interface In1
    {
        final int a = 10;
        default void display()
        {
            System.out.println("你好");
        }
    }
    // 一个实现接口的类
    class TestClass implements In1
    {
        // 测试代码
        public static void main (String[] args)
        {
            TestClass t = new TestClass();
            t.display();
        }
    }

    输出:

    hello
  2. JDK 8中添加的另一个功能是,我们现在可以在接口中定义静态方法,这些接口可以在没有对象的情况下独立调用。注意:这些方法不是继承的。
    // Java展示在接口中定义静态方法
    interface In1
    {
        final int a = 10;
        static void display()
        {
            System.out.println("你好");
        }
    }
    // 一个实现接口的类
    class TestClass implements In1
    {
        // 测试代码
        public static void main (String[] args)
        {
            In1.display();
        }
    }

    输出:

    你好

有关接口的重点:

  • 我们无法创建接口的实例(无法实例化接口),但可以对其进行引用,该引用指向其实现类的Object。
  • 一个类可以实现多个接口。
  • 一个接口可以扩展另一个接口或多个接口。
  • 实现接口的类必须实现接口中的所有方法。
  • 所有方法都是公开和抽象的。并且所有字段都是公共的,静态的和最终的。
  • 它用于实现多重继承。
  • 它用于实现松散耦合。

JDK 9中接口中添加的新功能
从Java 9开始,接口还可以包含以下内容

  1. 静态方法
  2. 私人方法
  3. 私有静态方法