Java 接口

接口(interface):是一种抽象类型,是对类的一组需求的描述。需求指的是,比如要使用 Arrays 类的 sort 方法对 Employee 对象数组进行排序,那么 Employee 类必须实现 Comparable 接口。

// 语法
[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

// Comparable接口的代码:
public interface Comparable {
   int compareTo(T other);
}

调用x.compareTo(y)时,当 x < y,返回一个负数;当 x > y,返回一个正数;否则返回0。

接口特性

  • 一个类可以实现多个接口
  • 接口没有构造函数
  • 接口中没有已实现的方法,全都是抽象方法,方法会被隐式地指定为 public abstract
  • 接口中的所有方法自动地属于 public,因此在接口中声明方法时不必提供关键字 public,但在实现接口时,必须提供 public;
  • 接口中可以定义成员变量,这些成员变量默认都是 public static final 的静态常量;
  • 一个实现接口的类,必须实现接口内的所有方法,否则必须声明为抽象类。

注意:抽象类实现接口的话不需要实现接口内的所有方法!(抽象类允许抽象方法的存在)

如何实现一个接口?

为了让类实现一个接口,两个步骤:

  1. 将类声明为实现给定的接口。(使用关键字:implements)
  2. 实现接口中的所有方法。
class Employee implements Comparable {
    public int compareTo(Employee other) {
        return Double.compare(salary,other.salary);
    }
}

注意:

  • JDK1.8 以后,接口允许存在静态方法默认方法,即允许存在包含具体实现的方法;
  • JDK 1.9 以后,允许将方法定义为 private,允许存在私有接口方法,使得某些复用的代码不会把方法暴露出去;

为什么要添加这个特性?

因为在 JDK 1.8 之前,接口中的方法都是抽象方法,当我们需要修改接口时,就要修改所有实现这个接口的类,这显然不合适,所以解决方法是在接口中添加新的方法,但是这样也要在类中添加这个方法的实现,所以引进默认方法和静态方法,解决了接口的修改与现有实现不兼容的问题

public interface Test{
    // 1.默认方法,用default修饰。只能通过接口实现类的对象调用默认方法
    default String fun1(String s){
        return s;
    }
    // 2.静态方法,用static修饰。只能通过接口名调用静态方法
    static void fun2(){
        System.out.println("xxx");
    }
}

如果一个类实现了多个接口,具有相同名字的默认方法如何解决冲突?

public interface Vehicle {
   default void print(){
      System.out.println("我是一辆车!");
   }
}
 
public interface FourWheeler {
   default void print(){
      System.out.println("我是一辆四轮车!");
   }
}

第一个解决方案是创建自己的默认方法,来覆盖重写接口的默认方法:

public class Car implements Vehicle, FourWheeler {
   default void print(){
      System.out.println("我是一辆四轮汽车!");
   }
}

第二种解决方案可以使用 super 来调用指定接口的默认方法

public class Car implements Vehicle, FourWheeler {
   public void print(){
      Vehicle.super.print();
   }
}

抽象类和接口的区别?

  • 实现:抽象类和接口都是 Java 中的抽象类型,抽象类通过继承实现,一个类只能有一个继承关系,但是一个类能实现多个接口;
  • 方法:抽象类允许有实现方法,接口只能有未实现的方法,即抽象方法;
  • 成员变量:抽象类的成员变量可以是各种类型的,接口中的成员变量只能是 public static final 类型的静态常量;
  • 实现理念:抽象类和接口的实现理念不同,抽象类表示 is-a 关系,接口表示 has-a 关系;

参考资料:

  1. Java 接口 | 菜鸟教程
  2. 「Java核心技术 卷1 基础知识 原书第9版」

你可能感兴趣的:(java)