面向对象集|每日一题:抽象类和接口的区别是什么?

366 阅读2分钟

参考回答:

1.抽象类(abstract class)毕竟是一个类,Java 是单根继承嘛,所以一个子类只能继承一个抽象类;但是一个子类可以实现多个接口(interface),并且一个接口也可以继承多个接口来扩展自身。

2.抽象类和接口都不能实例化,但抽象类可以有构造方法,而接口不能有构造方法。

3.接口中定义的变量只能是 public static final 修饰的静态常量,而抽象类没有此限制。

4.有抽象方法的一定是抽象类,但抽象类不一定有抽象方法,它也可以有非抽象方法;而接口在 JDK 1.8 之前定义的方法都是抽象方法,在 JDK 1.8 开始也可以定义被 default 修饰的带实现的默认方法。不过如果一个实现类实现的两个接口都有相同的方法,而且它们对这个方法都进行了 default 默认实现,那么实现类就必须重写该方法。

public interface InterfaceDemo {
	
    default void testDefault() {
        System.out.println("带默认实现的方法。");
    }
	
}

5.接口在 JDK 1.8 之前因为只能定义抽象方法,所以所有的方法都是 public 修饰的(为了子类可以进行方法重写),但在 JDK 1.8 开始支持定义带实现的默认方法,所以在 JDK 1.9 的时候,也可以定义私有方法了,这样在接口中就可以复用内部方法了,当然了抽象方法依然只能是 public 修饰的;抽象类除了抽象方法不能定义为私有访问权限的之外,其他没有限制。

6.抽象类中可以定义静态方法,且可以被子类使用;而接口在 JDK 1.8 开始才可以定义静态方法,并且只能被接口调用,接口的实现类无法使用。

public interface InterfaceDemo {
	
    static void testStatic() {
        System.out.println("静态方法,只能被该接口直接调用,InterfaceDemo.testStatic()。");
    }
	
}

7.抽象类和接口都代表着系统的抽象层,但抽象类可以通过抽取子类共有的信息来实现属性和行为的复用,而接口往往是作为子类的行为规范,虽然也增加了默认实现,但也仅仅是行为的复用。

推荐回答思路: 先从类和接口的区别提起,再由它们的组成开始介绍:构造方法 -> 成员变量 -> 成员方法(抽象及访问权限修饰符) -> 静态方法 -> 作用。