【Java】接口和抽象类有什么共同点和区别?

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~

个人主页:.29.的博客

学习社区:进去逛一逛~

【Java】接口和抽象类有什么共同点和区别?


比较:接口和抽象类

🚀共同点

共同点

  1. 抽象性: 接口和抽象类都是用于表示抽象类型,不能被实例化,需要子类来实现或继承
  2. 包含抽象方法: 接口和抽象类都可以包含抽象方法 ,这些方法在子类中需要被具体实现。
  3. 支持多态: 通过接口或抽象类,可以实现多态性 ,即通过统一的接口或抽象类类型引用不同的实现类对象。
  4. 都可以有默认实现的方法: Java 8 可以用 default 关键字在接口中定义默认方法

在 Java 8 及以后的版本中,引入了默认方法(Default Methods) 的概念,允许在接口中使用 default 关键字为接口方法提供默认的实现。这样可以在不破坏现有代码的基础上向接口中添加新的方法,而不需要修改所有实现该接口的类。同样,抽象类也可以拥有具有默认实现的方法。

下面是一个简单的例子,演示了在接口和抽象类中使用 default 关键字声明默认实现的方法:

在这个例子中,MyInterface 接口和 MyAbstractClass 抽象类

都定义了一个抽象方法 abstractMethod 和一个默认方法 defaultMethod

然后,MyClass 类实现了这个接口并继承了抽象类,实现了抽象方法,并且可以选择是否重写默认方法。

main 方法中,创建了 MyClass 的实例,并调用了抽象方法和默认方法,展示了默认方法的使用。

java 复制代码
// 接口
interface MyInterface {
    // 抽象方法
    void abstractMethod();

    // 默认方法
    default void defaultMethod() {
        System.out.println("This is a default implementation of MyInterface.");
    }
}

// 抽象类
abstract class MyAbstractClass {
    // 抽象方法
    abstract void abstractMethod();

    // 默认方法
    default void defaultMethod() {
        System.out.println("This is a default implementation of MyAbstractClass.");
    }
}

// 具体类实现接口和继承抽象类
class MyClass extends MyAbstractClass implements MyInterface {
    // 实现抽象方法
    @Override
    void abstractMethod() {
        System.out.println("This is the implementation of abstractMethod in MyClass.");
    }

    // MyClass 可以选择重写默认方法
    @Override
    public void defaultMethod() {
        System.out.println("This is a overridden default implementation in MyClass.");
    }
}

public class DefaultMethodExample {
    public static void main(String[] args) {
        // 创建 MyClass 实例
        MyClass myClass = new MyClass();

        // 调用抽象方法和默认方法
        myClass.abstractMethod();
        myClass.defaultMethod();
    }
}

🚀区别

区别

  1. 能否多继承: 一个类可以实现多个接口,但只能继承一个抽象类。
  2. 成员变量: 接口的成员变量只能是public static final修饰的常量,不能被修改且必须有初始值;抽象类可以包含实例变量,成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
  3. 构造方法: 接口不能有构造方法;抽象类可以有构造方法,子类实例化时会调用父类的构造方法。
  4. 用途: 接口主要用于对类的行为进行约束(即定义规范),支持多继承,你实现了某个接口就具有了对应的行为,强调一种能力;抽象类主要用于建立类的层次结构以实现代码复用,强调的是所属关系。

相关推荐
懒大王爱吃狼1 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷2 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
阿伟*rui2 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
待磨的钝刨2 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
深度学习lover3 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
XiaoLeisj4 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck4 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei4 小时前
java的类加载机制的学习
java·学习
API快乐传递者4 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
励志成为嵌入式工程师5 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim