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

灰太狼 2024-03-30 16:36 196阅读 0赞

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

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

关于了解接口与抽象类更多的区别,请参考这篇博客:

https://blog.csdn.net/crazy_xieyi/article/details/126266418

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

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

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

e9e2c251251f4fd1b09cd0461706d31c.png

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

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

1350e0c4053f4f1b9a5d26b84a62a732.png

递归遍历删除文件

  1. public class IOdemo1 {
  2. private static Scanner scanner = new Scanner(System.in);
  3. public static void main(String[] args) {
  4. // 输入一个指定搜索的目录
  5. System.out.println("请输入要搜索的路径: ");
  6. String basePath = scanner.next();
  7. // 针对输入进行简单判定
  8. File root = new File(basePath);
  9. if (!root.isDirectory()) {
  10. // 路径不存在, 或者只是一个普通文件, 此时无法进行搜索.
  11. System.out.println("输入的目录有误!");
  12. return;
  13. }
  14. // 再输入一个要删除的文件名
  15. System.out.println("请输入要删除的文件名: ");
  16. String nameToDelete = scanner.next();
  17. // 针对指定的路径进行扫描,递归操作
  18. // 先从根目录出发(root)
  19. // 先判定一下, 当前的这个目录里, 看看是否包含咱们要删除的文件。如果是, 就删除; 否则就跳过下一个
  20. // 如果当前这里包含了一些目录, 再针对子目录进行递归
  21. scanDir(root, nameToDelete);
  22. }
  23. private static void scanDir(File root, String nameToDelete) {
  24. //打印递归的路径
  25. System.out.println("[scanDir] " + root.getAbsolutePath());
  26. // 1. 先列出 root 下的文件和目录
  27. File[] files = root.listFiles();
  28. if (files == null) {
  29. // 当前 root 目录下没东西. 是一个空目录
  30. // 结束继续递归
  31. return;
  32. }
  33. // 2. 遍历当前的列出结果
  34. for (File f : files) {
  35. if (f.isDirectory()) {
  36. // 如果是目录, 就进一步递归
  37. scanDir(f, nameToDelete);
  38. } else {
  39. // 如果是普通文件, 则判定是否要删除
  40. if (f.getName().contains(nameToDelete)) {
  41. System.out.println("确认是否要删除 " + f.getAbsolutePath() + " 嘛?");
  42. String choice = scanner.next();
  43. if (choice.equals("y") || choice.equals("Y")) {
  44. f.delete();
  45. System.out.println("删除成功!");
  46. } else {
  47. System.out.println("删除取消!");
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }

拷贝文件:

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

  1. public class IODemo2 {
  2. public static void main(String[] args) {
  3. // 输入两个路径
  4. Scanner scanner = new Scanner(System.in);
  5. System.out.println("请输入要拷贝哪个文件: ");
  6. String srcPath = scanner.next();
  7. System.out.println("请输入要被到到哪个地方: ");
  8. String destPath = scanner.next();
  9. File srcFile = new File(srcPath);
  10. if (!srcFile.isFile()) {
  11. // 如果源不是一个文件(是个目录或者不存在),此时就不做任何操作
  12. System.out.println("您当前输入的源路径有误!");
  13. return;
  14. }
  15. File destFile = new File(destPath);
  16. if (destFile.isFile()) {
  17. // 如果已经存在, 认为也不能拷贝
  18. System.out.println("您当前输入的目标路径有误!");
  19. return;
  20. }
  21. // 进行拷贝操作.
  22. try (InputStream inputStream = new FileInputStream(srcFile);
  23. OutputStream outputStream = new FileOutputStream(destFile)) {
  24. // 进行读文件操作.
  25. while (true) {
  26. int b = inputStream.read();
  27. if (b == -1) {
  28. break;
  29. }
  30. outputStream.write(b);
  31. }
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

发表评论

表情:
评论列表 (有 0 条评论,196人围观)

还没有评论,来说两句吧...

相关阅读

    相关 抽象接口什么区别

    首先抽象类和接口都是 Java 中多态的常见使用方式。 区别可以理解为接口比抽象类更加的抽象,但是抽象类的功能是比接口更多的。 关于了解接口与抽象类更多的区别,请参考这篇博

    相关 java抽象接口什么区别

    很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。 在讨论它们之间的不同点之前,我们先看看

    相关 抽象接口什么区别

    (1)接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。 抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类

    相关 接口抽象什么区别

    接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。 抽象类表示的是,这个对象是什么。...