抽象类和接口有什么区别?

简介: 抽象类和接口有什么区别?

首先抽象类和接口都是 Java 中多态的常见使用方式。

区别可以理解为接口比抽象类更加的抽象,但是抽象类的功能是比接口更多的。

抽象类和普通类,其实差别不是特别大,只不过抽象类不能new示例,和不能直接使用抽象方法,而且抽象类是可以有普通方法,也可以有普通的属性。

比如在文件IO操作的时候,InputStream/OutputStream/Reader/Writer都是抽象类,是不能直接new的,需要new它的子类。

附:文章底部附有递归遍历删除文件拷贝文件的代码(文件操作IO

对于抽象类来说,大部分的东西都是确定的,有几个属性有几个方法大部分都是明确的,只有一小部分是抽象方法。而对于接口来说,大部分都是不确定的,有什么属性是不知道的,方法也是抽象方法(不考虑default的情况),所以可以认为接口是比抽象类更加的抽象。

抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而 接口中不能包含普通方法, 子类必须重写所有的抽象方法。


递归遍历删除文件

public class IOdemo1 {
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        // 输入一个指定搜索的目录
        System.out.println("请输入要搜索的路径: ");
        String basePath = scanner.next();
        // 针对输入进行简单判定
        File root = new File(basePath);
        if (!root.isDirectory()) {
            // 路径不存在, 或者只是一个普通文件, 此时无法进行搜索.
            System.out.println("输入的目录有误!");
            return;
        }
        // 再输入一个要删除的文件名
        System.out.println("请输入要删除的文件名: ");
        String nameToDelete = scanner.next();
        // 针对指定的路径进行扫描,递归操作
        // 先从根目录出发(root)
        // 先判定一下, 当前的这个目录里, 看看是否包含咱们要删除的文件。如果是, 就删除; 否则就跳过下一个
        // 如果当前这里包含了一些目录, 再针对子目录进行递归
        scanDir(root, nameToDelete);
    }
    private static void scanDir(File root, String nameToDelete) {
        //打印递归的路径
        System.out.println("[scanDir] " + root.getAbsolutePath());
        // 1. 先列出 root 下的文件和目录
        File[] files = root.listFiles();
        if (files == null) {
            // 当前 root 目录下没东西. 是一个空目录
            // 结束继续递归
            return;
        }
        // 2. 遍历当前的列出结果
        for (File f : files) {
            if (f.isDirectory()) {
                // 如果是目录, 就进一步递归
                scanDir(f, nameToDelete);
            } else {
                // 如果是普通文件, 则判定是否要删除
                if (f.getName().contains(nameToDelete)) {
                    System.out.println("确认是否要删除 " + f.getAbsolutePath() + " 嘛?");
                    String choice = scanner.next();
                    if (choice.equals("y") || choice.equals("Y")) {
                        f.delete();
                        System.out.println("删除成功!");
                    } else {
                        System.out.println("删除取消!");
                    }
                }
            }
        }
    }
}

拷贝文件:

如果文件不存在,OutputStream会自动创建,但是InputStream会直接报错。

public class IODemo2 {
    public static void main(String[] args) {
        // 输入两个路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝哪个文件: ");
        String srcPath = scanner.next();
        System.out.println("请输入要被到到哪个地方: ");
        String destPath = scanner.next();
        File srcFile = new File(srcPath);
        if (!srcFile.isFile()) {
            // 如果源不是一个文件(是个目录或者不存在),此时就不做任何操作
            System.out.println("您当前输入的源路径有误!");
            return;
        }
        File destFile = new File(destPath);
        if (destFile.isFile()) {
            // 如果已经存在, 认为也不能拷贝
            System.out.println("您当前输入的目标路径有误!");
            return;
        }
        // 进行拷贝操作.
        try (InputStream inputStream = new FileInputStream(srcFile);
             OutputStream outputStream = new FileOutputStream(destFile)) {
            // 进行读文件操作.
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    break;
                }
                outputStream.write(b);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



相关文章
|
人工智能 算法 数据管理
工业机理模型
工业机理模型
1006 2
|
数据采集 机器学习/深度学习 人工智能
揭秘AI大模型的‘梦幻迷雾’:一场关于真实与虚假的智力较量,你能否穿透幻觉迷雾,窥见真相之光?
【10月更文挑战第13天】本文深入探讨了大模型幻觉的底层逻辑,分析了其产生的原因、表现形式及解决方案。从数据质量、模型复杂度、解码策略等方面解析幻觉成因,提出了提高数据质量、引入正则化技术、增强上下文理解等对策,旨在减少大模型生成不准确或虚假信息的风险。
589 1
|
编解码 数据格式
IMX6ULL开发板spi OLED驱动
【8月更文挑战第24天】本文档介绍在IMX6ULL开发板上实现SPI接口OLED显示器驱动的步骤。首先需正确连接OLED至开发板的SPI接口,包括时钟(SCLK)、数据(MOSI)及片选(CS)等线路。理解SPI协议与OLED规格也很关键:SPI为同步串行通信,涉及主从设备交互;OLED参数如分辨率、颜色深度等须明确。接下来配置IMX6ULL的SPI控制器,通过设备树设定时钟频率、数据宽度等参数,并加载内核驱动。最后编写驱动程序,初始化SPI设备、发送控制命令与数据以完成OLED初始化,并实现文本或图像的显示功能。
431 1
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
512 1
|
数据安全/隐私保护
基于比例控制器的SOFC燃料电池控制系统simulink建模与仿真
本课题基于MATLAB2022a,完成SOFC燃料电池控制系统在Simulink中的建模与仿真,采用比例控制器实现充放电控制。固体氧化物燃料电池(SOFC)是一种高效能量转换装置,可直接将化学能转化为电能,具备高效率、低排放等优势。然而,其工作环境复杂,需精确控制温度与气体浓度以保障稳定运行。比例控制器因结构简单、响应迅速,在SOFC控制中广泛应用。通过仿真验证,优化控制器参数,确保系统高效稳定运行。
基于比例控制器的SOFC燃料电池控制系统simulink建模与仿真
|
机器学习/深度学习 人工智能 数据安全/隐私保护
《探秘课程蒸馏体系“三阶训练法”:解锁知识层级递进式迁移的密码》
在人工智能与教育科技融合的时代,课程蒸馏体系中的“三阶训练法”崭露头角。该方法借鉴知识蒸馏思想,通过三个阶段逐步引导学习者实现知识的深度理解与灵活应用。一阶:知识奠基,感知基础概念;二阶:能力提升,深化知识理解;三阶:迁移应用,实现知识贯通。此法遵循认知规律,助力高效学习与能力提升。
432 18
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
790 8
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
754 2
|
应用服务中间件 Linux 网络安全
CentOS 7 上安装 Nginx
在 CentOS 7 上安装 Nginx 的步骤包括:添加 EPEL 仓库,安装 Nginx,启动 Nginx,配置防火墙规则,最后通过访问服务器 IP 验证安装是否成功
853 0
|
存储 API C语言
C/C++爱心代码
C/C++爱心代码
4193 2