抽象类和接口


前言:当面试官在问到我这块知识点的时候,我整个人脑子只是冒出来interface和abstract这两个关键字。仅说出了接口和抽象类各自的特征,但是二者之间的异同点答得不是很好,这块知识点老是记不住,还是需要通过代码来了解比较直观。

接口和抽象类的概念以及定义

interface :接口

/**
 * 接口
 */
public interface InterfaceTest {
    /**
     * 接口定义对象默认使用public static final进行定义
     */
    public static final String TEST = ""; // TODO 显示Public static final是多余的

    /**
     * 接口的方法默认使用public abstarct 进行定义,并且接口的方法不能有方法体
     * @return
     */
    public abstract double getVal(); // TODO 显示Public abstract是多余的

    /**
     * java8 接口能定义default方法的缺省的默认方法体
     * java9 接口能定义私有静态方法
     * @return
     */
    default long getTest() {
        return 0;
    }

    public static long getTime() {  // TODO 显示Public是多余的

        return 0;
    }

    public void run();

}

abstract :抽象

/**
 * 抽象类
 */
public abstract class AbstractTest {

    private String abs;

    // TODO 无参和有参的构造器
    public AbstractTest() {
    }

    public AbstractTest(String abc) {
        this.abs = abc;
    }

    // TODO Get/Set方法
    public String getAbs() {
        return abs;
    }

    public void setAbs(String abs) {
        this.abs = abs;
    }

    @Override
    public String toString() {
        return "AbstractTest{" +
                "abs='" + abs + '\'' +
                '}';
    }

    // TODO Extension methods can only be used within an interface 扩展方法只能在接口内使用
    // default void getString(){}  // 提示错误

    public abstract double getVal(); // TODO 抽象方法

    public static void main(String[] args) { // TODO main方法

    }
}

学习过程中,可以针对类和抽象类之间的异同点,抽象类和接口之间的异同点来理解,这种方式能直观的看到三者之间的关系。

抽象类 接口
成员变量
能定义成员变量
接口的变量默认使用public static final定义。使得该变量不能发生修改,接口不能定义成员变量
构造器 能定义构造器 接口不能定义构造器
普通方法 能定义普通方法 接口中的方法默认使用public abstract修饰
静态方法 能定义静态方法 接口能定义静态方法。但静态方法不能抽象[1]
抽象方法 能定义抽象方法,必须使用public abstract修饰该方法 接口中定义的方法除静态方法和default修饰的方法都是抽象方法(jdk1.8)。
继承/实现 能实现单继承,多实现 多实现
定义default方法 仅能在接口中定义
定义main方法 能定义main方法 不能定义main方法
创建实例 AbstractTest absTest = new AbstractTest(); // 使用匿名类的方式InterfaceTest test = new InterfaceTest(){ @Override // TODO 重写接口中的方法}// 使用多态的方式,将接口的实现类的实例指向接口对象也能创建接口实例InterfaceTest test = new InterfaceTestImpl();

[1]:针对静态方法在接口中不能抽象的个人理解 -> 静态方法本身存在是需要方法体的,并且可以通过(类名.方法名)去调用。而抽象方法不存在方法体。

使用场景:

个人认为:接口和抽象类的应用场景跟接口和抽象类的异同点相关的。

接口:接口可以具体的阐述某种对象的行为/特征。举个例子:某个对象的增删改查的业务逻辑操作,可以使用接口去实现这些操作。大多数情况下,实现一个接口的场景比较多。

抽象类:抽象类则偏向多个对象的共性或者说是多个对象同时拥有或者具备的特征/行为。比如说,人类中存在一个work()的抽象方法,老师和学生这两个对象,都是属于人类。当老师和学生这两个对象去继承人类这个父类的时候。他们就要完成这个work()的实现。老师的work()主要是授课,而学生的work()主要是学习

上述仅为个人理解,理解有误的地方希望读者进行反馈,谢谢


 上一篇
重构SpringBoot项目 重构SpringBoot项目
最近在学习微服务的过程中,需要将之前学到的SpringBoot项目重构。 个人在学习过程中参考 慕课网小马哥的 Spring Boot 2.0深度实践-初遇Spring Boot 这门课程是免费的。如果博客阐述不当,可以去看看小马哥的视频
2020-08-17
下一篇 
项目打包运行在后台 项目打包运行在后台
进入到项目的路径下,输入以下命令完成项目打包 $ mvn clean package 打包好的项目默认在项目目录中的target文件夹中, target中的eureka-0.0.1-SNAPSHOT.jar就是打包好的jar包
2020-08-08
  目录