【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. 用途: 接口主要用于对类的行为进行约束(即定义规范),支持多继承,你实现了某个接口就具有了对应的行为,强调一种能力;抽象类主要用于建立类的层次结构以实现代码复用,强调的是所属关系。

相关推荐
Blossom.1181 小时前
把 AI 塞进「自行车码表」——基于 MEMS 的 3D 地形预测码表
人工智能·python·深度学习·opencv·机器学习·计算机视觉·3d
祈祷苍天赐我java之术5 小时前
Linux 进阶之性能调优,文件管理,网络安全
java·linux·运维
无处不在的海贼5 小时前
小明的Java面试奇遇之发票系统相关深度实战挑战
java·经验分享·面试
武子康5 小时前
Java-109 深入浅出 MySQL MHA主从故障切换机制详解 高可用终极方案
java·数据库·后端·mysql·性能优化·架构·系统架构
蒋星熠5 小时前
区块链技术探索与应用:从密码学奇迹到产业变革引擎
python·语言模型·web3·去中心化·区块链·密码学·智能合约
秋难降5 小时前
代码界的 “建筑师”:建造者模式,让复杂对象构建井然有序
java·后端·设计模式
bdgtd881785 小时前
动态修补C扩展模块的函数指针有哪些风险?安全的修补方案是什么?
c语言·开发语言·安全
luquinn6 小时前
实现统一门户登录跳转免登录
开发语言·前端·javascript
Forward♞6 小时前
Qt——界面美化 QSS
开发语言·c++·qt
BillKu6 小时前
Spring Boot 多环境配置
java·spring boot·后端