面试题:Java中 接口 和 抽象类 的区别

接口 和 抽象类 定义

抽象类:如果多个类中包含相同的行为,但行为发出的动作不一样,这时可以进行上层的抽象,抽象出一层功能定义,即抽象方法,但没有对应的功能实现。抽象方法包含在被 abstract 修饰的类中即抽象类。它具有如下特点

  • abstract 修饰的方法称为抽象方法,抽象方法只有方法声明没有方法体
    • 注意:抽象类是为了继承重写抽象方法的,所以抽象类不能用 final 修饰。同时外部抽象类不允许使用 static 声明,而内部的抽象类可以使用 static 声明(继承的时候使用“外部类.内部类”的形式表示类名称)
  • 抽象类可以包含属性、方法、构造方法,但构造方法不能用来实例化对象,只能被子类调用
    • 抽象类中的构造方法,其存在目的是为了抽象类的属性初始化
    • 注意:子类对象实例化时,先执行父类构造器,再执行子类构造器
  • 抽象类不能被实例化,只能被继承
  • 包含抽象方法的类一定是抽象类,但抽象类不一定包含抽象方法,抽象类还可以包含普通方法
  • 抽象方法的权限修饰符只能为 public、protected、default,默认情况下为 public
  • 一个类继承于一个抽象类,则子类必须实现抽象类的抽象方法,如果子类没有实现父类的抽象方法,那子类必须定义为抽象类
public abstract class AbstractName{
    
    public String variable;
    
    public AbstractName(String variable){
        this.variable = variable;
    }
    
    public abstract void method1();
    
    public void method2(){
        //do something
    }
}

接口:Java接口可以看成是一种特殊的类,即用 interface 关键字修饰的类。它具有如下特点

  • 接口中可以包含 变量 和 方法,变量被隐式指定为 public static final,方法被隐式指定为 public abstract
  • 接口支持多继承,解决了 Java 中类不能多继承的问题
  • 一个类可以同时实现多个接口,一个类实现某个接口则必须实现该接口中的抽象方法,否则该类必须被定义为抽象类
public interface InterfaceName{
    
    public static final int variable=10;

    default void method1(){
        //do something
    }
    
    public static void method2(){
        //do something
    }
    
    public void method3();
}

总结:从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范


 接口 和 抽象类 区别

  1.  接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现和静态方法),而抽象类可以有非抽象的方法
    1. 在 Java8 中,接口也可以定义静态方法,可以直接用接口名调用,实现类是不可以调用的。如果实现类同时实现两个接口,接口中都定义了一样的默认方法,则必须重写,不然会报错

  2. 接口中除了 staticfinal 变量,不能有其他变量(在接口中,属性都是默认public static final修饰的,这三个关键字可以省略),而抽象类中则不一定
  3. 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口
  4. 接口方法默认修饰符是 public,抽象方法可以有 publicprotecteddefault 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰)
posted @ 2022-05-17 21:37  伊文小哥  阅读(61)  评论(0编辑  收藏  举报