Java中的接口知识点 | 青训营

130 阅读4分钟

一、接口的定义和特点

接口是一种特殊的类,它只包含常量和抽象方法的定义,并且没有实例变量和具体的实现方法。接口的定义使用关键字interface,如下所示:

public interface MyInterface {
    // 常量定义
    int MAX_COUNT = 10;
    
    // 抽象方法定义
    void method();
}

接口的特点如下:

  1. 接口中的常量是 public static final 的,默认就是这样的修饰,所以可以省略。
  2. 接口中的方法是 public abstract 的,默认也是这样的修饰,所以也可以省略。
  3. 接口不能被实例化,即不能创建接口的对象。
  4. 一个类可以实现多个接口,一个接口也可以被多个类实现。
  5. 一个类可以同时继承一个类并实现多个接口。
  6. 实现接口时,需要实现接口中的所有方法,否则该类需要声明为抽象类。

二、接口的实现

实现接口使用关键字implements,如下所示:

public class MyClass implements MyInterface {
    public void method() {
        System.out.println("实现了接口中的方法");
    }
}

在上面的代码中,MyClass类实现了MyInterface接口,并且实现了接口中的method方法。实现接口时,需要在类中提供对应的实现方法,否则需要将类声明为抽象类。

三、接口的使用

3.1 接口的引用

接口不能被实例化,但可以定义接口的引用变量,用于引用实现了该接口的对象。具体的代码如下:

MyInterface obj = new MyClass();

在上面的代码中,obj是一个MyInterface类型的引用变量,它引用了一个MyClass对象。通过接口的引用,可以调用接口中定义的方法,但无法调用实现类中特有的方法。

3.2 接口的多实现

一个类可以实现多个接口,通过逗号分隔多个接口的名称即可。具体的代码如下:

public class MyClass implements MyInterface1, MyInterface2 {
    // 实现方法
}

在上面的代码中,MyClass类实现了MyInterface1和MyInterface2两个接口。这样,MyClass类就需要实现这两个接口中的所有方法。

3.3 接口的多继承

一个接口可以继承多个接口,通过关键字extends实现。具体的代码如下: public interface MyInterface3 extends MyInterface1, MyInterface2 { // 空的接口定义 }

在上面的代码中,MyInterface3接口继承了MyInterface1和MyInterface2两个接口。这样,MyInterface3接口中就包含了这两个接口中定义的所有方法。

3.4 接口的默认方法

在Java 8之后,接口中可以定义默认方法(default method),默认方法在接口中有默认的实现。具体的代码如下:

public interface MyInterface {
    default void method() {
        System.out.println("默认方法的实现");
    }
}

public class MyClass implements MyInterface {
    // 不需要实现 method 方法
}

在上面的代码中,MyInterface接口中定义了一个默认方法method,它有一个默认的实现。MyClass类实现了MyInterface接口,但不需要实现method方法,因为它已经有了默认的实现。

3.5 接口的静态方法

在Java 8之后,接口中可以定义静态方法(static method),静态方法是接口的一部分。具体的代码如下:

public interface MyInterface {
    static void staticMethod() {
        System.out.println("静态方法的实现");
    }
}

public class MyClass {
    // 不需要实现 staticMethod 方法
}

在上面的代码中,MyInterface接口中定义了一个静态方法staticMethod。MyClass类不需要实现staticMethod方法,因为它已经隐式地继承了该方法。

四、接口的应用

4.1 实例

接口的一个主要应用是实现多继承,以便实现多个接口定义的方法。例如,假设要实现一个游泳器的接口Swimmer和一个飞行器的接口Flyer,可以定义一个鸟类Bird,它同时实现这两个接口,实现代码如下:

public interface Swimmer {
    void swim();
}

public interface Flyer {
    void fly();
}

public class Bird implements Swimmer, Flyer {
    public void swim() {
        System.out.println("鸟在水中游泳");
    }
    
    public void fly() {
        System.out.println("鸟在空中飞行");
    }
}

在上面的代码中,Swimmer接口定义了swim方法,Flyer接口定义了fly方法。Bird类实现了Swimmer和Flyer两个接口,同时实现了这两个接口中的方法。

4.2 接口的回调

接口的另一个常见应用是回调机制。回调机制是指将一个方法作为参数传递给另一个方法,并在需要的时候调用该方法。例如,假设有一个按钮类Button,需要在按钮被点击时调用一个方法,可以定义一个回调接口ClickListener,如下所示:

public interface ClickListener {
    void onClick();
}

public class Button {
    private ClickListener clickListener;
    
    public void setClickListener(ClickListener clickListener) {
        this.clickListener = clickListener;
    }
    
    public void click() {
        if (clickListener != null) {
            clickListener.onClick();
        }
    }
}

在上面的代码中,ClickListener接口定义了onClick方法,Button类有一个setClickListener方法用于设置点击监听器,并在click方法中调用该方法。

使用回调机制时,可以创建一个实现了ClickListener接口的类,并将其作为参数传递给Button类的setClickListener方法,如下所示:

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        button.setClickListener(new ClickListener() {
            public void onClick() {
                System.out.println("按钮被点击了");
            }
        });
        
        button.click();  // 输出:按钮被点击了
    }
}

在上面的代码中,一个匿名类实现了ClickListener接口,并在onClick方法中输出信息。通过setClickListener方法将该监听器设置给Button类,在调用click方法时触发了监听器的onClick方法。