抽象类和接口的区别

区别

  1. 一个类只能继承一个父类,但是可以实现多个接口。一个接口可以继承多个接口。

  2. 抽象类的属性没有限制,接口的所有属性必须是 public static final

  3. 抽象类的方法没有限制,接口的所有方法必须是 public abstract 的实例方法(注:新版本的 JDK 关于接口的规则有变化)

  4. 抽象类包含构造方法,接口不包含构造方法。

  5. abstract class 的方法主要是Code Reuse,提供defaultcommon的方法;interface 的方法是更像是一个扩展插件,或者一种约束

  6. 抽象类是对类整体进行抽象,接口是对类局部(行为)进行抽象.

接口注意事项

  1. 如果有一个类既实现了 A 接口又实现了 B,它们都有def(),并且 A 接口和 B接口没有继承关系的话,这时就必须重写def()。不然的话,编译的时候就会报错
interface Runner1 {
    default void run() {
        System.out.println("default Runner1::run");
    }
}

interface Runner2 {
    default void run() {
        System.out.println("default Runner2::run");
    }
}

static class RunnerImpl implements Runner1, Runner2 {
    public void run() {
        super.run(); // which one???
    }
}

  1. 理解Runner1.super.run()

Why is a method of superinterface called through Interface.super?

interface Runner1 {
    default void run() {
        System.out.println("default Runner1::run");
    }
}

interface Runner2 {
    default void run() {
        System.out.println("default Runner2::run");
    }
}

class RunnerImpl implements Runner1, Runner2 {
    public void run() {
        Runner1.super.run();
    }

    public static void main(String[] args) {
        RunnerImpl runner = new RunnerImpl();
        runner.run();
    }
}

// 输出
default Runner1::run

你可能感兴趣的:(基础知识,java)