Java速通4:接口

90 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1.接口:

  1. 抽象类算是半个类,所以用 extends 继承抽象类
  2. 接口完全不是类,所以用 implements 实现接口
  3. 作用:接口是把程序模块进行统一化的模板,是为了降低偶合(抽象类是为了重用)

2.接口中可定义的内容:

  • 抽象方法、常量、嵌套类型。

  • java8开始可以定义:默认方法、静态方法。

  • 上述这些可定义的内容,默认是 public 修饰的。(因为接口是提供给别人用的)

  • 接口中定义的常量可以省略 staticfinal

public static final int NUM = 10; 等价于 int NUM = 10;

所以接口中是不能定义成员变量的(定义了也会给你变为常量)。

public interface UserInfoDao{

    public abstract void select();

    //相当于(因为接口中的方法 默认是抽象方法)
    void select();
}

3.接口细节:

  1. 不能定义静态初始化块、构造方法。
  2. 接口也不能实例化(因为没有构造方法,所以不能通过new来创建)。
  3. 一个类可通过 implements 关键字实现一个或多个接口。 一个接口可以通过extends来继承一个或多个接口(接口可以多继承其他接口)
  4. 实现接口的类必须实现接口中定义的所有抽象方法,除非它是个抽象类。
public abstract class Student implements JiaImpl, BaoImpl{

}
  1. 若一个类实现的多个接口 中有相同的抽象方法,只需实现此方法一次。
  2. extends implements 一起使用,extends 必须写在implements前面。
  3. 当父类、接口中的某个方法签名一样时,那返回值类型也必须一致。
public interface Eatable{
    void eat(String name);
}

public class Animal{
    public int eat(String name){
        return name.length();
    }
}

public calss Dog extends Animal implements Eatable{

    //会报错,接口和父类 的此方法 返回值不一致
    public void eat(String name){

    }
}

4.抽象类与接口对比:

  1. 使用抽象类叫继承,使用接口叫实现。

    继承:A extends B,    A 是 B
    实现:A implements B, A 会 B 中的行为
    
  2. 接口为了降低耦合,抽象类为了重用。

  3. 构造方法:抽象类可有构造方法,接口不能有。

5.何时选择抽象类?

  1. 在紧密相关的类之间共享代码。(A,B 类之间有共同代码 D,可把 D 弄到抽象类中)
  2. 需要除public之外的访问权限。
  3. 需要定义实例变量,非 final 的静态变量。

6.何时选择接口?

  1. 不相关的类实现相同的方法。
  2. 只是定义行为,不关心具体是谁实现了行为。
  3. 想实现类型的多重继承。

7.默认方法:Default Method

  1. default 修饰的方法

  2. 默认方法只能是实例方法

  3. 默认方法不需要实现,直接可调用或重写。

  4. 若一个类 父类定义的非抽象方法与接口的默认方法相同时,最终调用父类的方法。

    // 父类
    public class Animal{
        public void run(){
            System.out.println("Animal - run");
        }
    }
    
    // 接口
    public interface Runnable{
        public default void run(){
            System.out.println("Runnable - run");
        }
    }
    
    // 调用
    public calss Dog extends Animal implements Runnable{
    
    }
    
  5. 若一个类 父类定义的抽象方法与接口的默认方法相同时,要求子类实现此抽象方法。

    public interface Eatable{
        public default void eat(String name){
            print("eat:" + name);
        }
    }