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

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

首先抽象类和接口都是 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();
        }
    }
}



相关文章
|
Windows
mathtype7产品激活密钥最新
MathType是强大的数学公式编辑器,MathType公式编辑器可以说是专门为理科生准备的软件,它可以帮助用户快速的在各种文档中插入符号和公式,不论是简单的公式和符号,还是复杂的都可以非常轻松的输入,并且在与office文档结合使用时,表现的非常完美,是非常好的一款软件,与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号,可用在编辑数学试卷、书籍、报刊、论文、幻灯演示等方面,是编辑数学资料的得力工具。
51812 0
|
算法 Java 调度
操作系统之进程调度——优先权法和轮转法(附上样例讲解)
多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
1120 0
操作系统之进程调度——优先权法和轮转法(附上样例讲解)
|
SQL 消息中间件 分布式计算
如何写好简历中的“个人总结”部分?
如何写好简历中的“个人总结”部分?
|
机器学习/深度学习 网络安全 异构计算
教你如何用家里闲置的Windows电脑搭建GPU服务器炼丹
教你如何用家里闲置的Windows电脑搭建GPU服务器炼丹
1987 0
教你如何用家里闲置的Windows电脑搭建GPU服务器炼丹
|
存储 数据可视化 数据处理
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
|
机器学习/深度学习 语音技术 算法框架/工具
|
SQL 数据库 Python
sqlmap的安装及使用教程_sqlmap安装使用教程
sqlmap的安装及使用教程_sqlmap安装使用教程
|
机器学习/深度学习 iOS开发 MacOS
MAC系统机器学习环境配置常见问题
MAC系统机器学习环境配置常见问题
|
JavaScript
Hexo个人博客之Next-8.20主题下载及美化
Hexo个人博客之Next-8.20主题下载及美化
|
编解码 网络协议 Android开发
adb+python实现自动领喵币
adb+python实现自动领喵币
284 0