抽象类和接口的区别?

前言

以前就知道抽象类是事物的抽象 ,接口是行为的抽象, 大白话就是,抽象类:我是什么?接口:我能做什么?最近看到抽象类思考为什么抽象类有构造函数而接口不需要构造函数,从而引出下文思考。

代码对比

我们先看看代码对比:

typescript 复制代码
public abstract class AbstractPerson {
    private String name;
    private int age;
    public AbstractPerson(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public  String getName(){
        return this.name;
    }
    public abstract String getSelfIntroduce();
    private String getDescription(){
        return "I am a " + this.name + " " + this.age + " years old";
    }
}
public class Employee extends AbstractPerson{
    public Employee(String name, int age) {
        super(name, age);
    }
    @Override
    public String getSelfIntroduce() {
        return "我是员工";
    }
}
public class Student extends AbstractPerson{
    public Student(String name, int age) {
        super(name, age);
    }
    @Override
    public String getSelfIntroduce() {
        return "我是一个学生";
    }
}
csharp 复制代码
public interface InterfacePerson {
    //接口中无法定义无含义变量
    //  public  String name;
    int age=10;
    public default String sayHello() {
        return "Hello,我是**,我"+age+"岁了!";
    }
    public abstract void hug();
}
public class Boss implements InterfacePerson{
    @Override
    public void hug() {
        System.out.println("Boss hug me");
    }
}
csharp 复制代码
public class Main {
    public static void main(String[] args) {
        //抽象类
        AbstractPerson a=new Student("小明",18);
        AbstractPerson b=new Employee("大红",41);
        System.out.println(a.getName());
        System.out.println(a.getSelfIntroduce());
        System.out.println(b.getName());
        System.out.println(b.getSelfIntroduce());
        //接口
        InterfacePerson c=new Boss();
        System.out.println(c.sayHello());
        c.hug();
    }
}

区别

可能代码繁杂,但是你按照这几个方向去对比即可

1. 两者方法上的区别

抽象父类中,测试的方法有构造方法,抽象方法(必须public被继承),普通方法。

接口中,测试的方法有public default方法,public abstract方法,由于接口就是用来实现的所以他们的public可以省略,且我们使用接口其实默认省略了public。

他们都有代码复用的方法,抽象类的getName方法,接口的default修饰的sayHello方法,其实他们两者的区别就是抽象类比接口多了构造函数, 为什么这么说,因为抽象类可以通过子类的构造函数利用supper给父类的变量赋值(也可以不赋值跟接口的复用函数作用一样)

2. 两者变量上的区别

变量上的区别比较简单,抽象类可以选择赋值或者不赋值,接口只能有被赋值的变量

总结

两者都可以代码复用,都可以继承/实现继承类/实现类的方法,由于有构造函数,抽象类的代码复用更加灵活,还有一些就是类与接口的区别,比如类单继承,接口多实现,抽象类的变量赋值比接口更灵活。

相关推荐
ly7689几秒前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠2 分钟前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
奇牙coding29 分钟前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!35 分钟前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻42 分钟前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
黄俊懿42 分钟前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
Rain的Java大神之路1 小时前
别再死磕 MySQL 了:向量数据库与 RAG 生产落地实录(Java 工程师专场)
java·后端·面试
七夜zippoe1 小时前
Spring AI 是什么?Java 工程师的 AI 开发第一站
java·人工智能·spring·ai·开发
是真的小外套1 小时前
2023年软考中级信息安全工程师|选择题考点+5道案例分析真题解析(含答案)
java·服务器·网络
会编程的吕洞宾1 小时前
Spring AI 2.0 结构化输出实战:让大模型返回精准 JSON 不再“抽风“,准确率从 78% 拉到 99%
java·后端