为什么Java编译器不支持导入inheritance?

在Java中,导入与(外部)类相关,因为每个(外部)类应该在单独的文件中编码。 因此,可以声称import ...; 类定义之前的指令与类相关联(有点像注释)。

现在,如果可以inheritance父类的导入,那将大大减少源文件的混乱。 为什么这不可能? 即为什么Java编译器也不考虑基类的导入?

笔记:

  • 可能有不止一个答案。
  • 我知道如果你让eclipse组织你的import,这不是什么大问题,不需要提及。 这是关于’为什么’,而不是’如何’(a-la- this )。

首先,重要的是要注意并非每个类都必须在单独的文件中编码 – 而是每个公共顶级类必须编码。 不,导入并不真正与任何类相关联 – 它们只是用于在文件中包含某些外部类/包的语句,以便可以使用它们。 事实上,你永远不需要实际导入任何东西,你总是可以使用全名,即:

 java.util.List list = new java.util.ArrayList(); 

导入是为了方便(并且仅用于编译器 – 它们在编译类后丢失),以避免必须编写所有这些,而只是让您编写List list = new ArrayList (从java.util进行相关导入后)。 因此,没有理由为什么子类应该“inheritance”导入。

import是语法糖,仅此而已。 如果你真的想要,你可以在不使用import语句的情况下编写任何Java程序。 例如,以下类自行编译:

 class Foo { java.util.List list = new java.util.ArrayList(); } 

此外,inheritance导入会使从类中删除导入变得更加困难。 例如,如果Bar.javainheritance自Foo.java ,则可能无法在不将其添加到Bar情况下从Foo删除导入。 强制导入是显式的,这使得更改单个文件变得更加容易,而不必担心对其他文件的影响,这通常是Java和面向对象编程的基本原则。

(最后一点与Go设计中的一个重要因素有关,Go特别试图避免在这个领域中出现C和C ++问题。)

让每个文件明确指定其导入可提高可读性。 想象一下打开一个文件并且无法一目了然地看到依赖项,因为导入是从另一个文件inheritance的。