2012-12-28 53 views
6

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

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

注:

  • 很可能有不止一个答案。
  • 我知道,如果你让eclipse组织你的导入,那么不需要提及这个问题。这是关于'为什么',而不是'如何'(a-la-this)。而是每公众,顶级类必须是 -
+0

您可以在一个文件中声明多个类。导入与文件相关,而不是类。 – MrSmith42

+2

如果父类导入'java.lang.annotation.Annotation'并且想要使用java.text.Annotation'的子类,该怎么办?如果导入是继承的,这将会变得复杂。 – jlordo

+0

我让我的IDE管理所有导入并将它们折叠起来,所以我甚至不会看到它们。我发现我不必经常考虑它们。 –

回答

10

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

java.util.List<String> list = new java.util.ArrayList<String>(); 

进口在那里为方便(并只用于编译 - 类编译后,他们都将丢失)以免让您不必写出所有内容,而只会让您编写List<String> list = new ArrayList<String>(在从java.util进行相关导入之后)。因此,没有理由为什么子类应该“继承”进口。

+1

+1每个公共,顶级课程都必须在它自己的文件中。公共嵌套类可以共享一个文件。 –

+3

+1,我认为明确声明只有编译器存在导入是很重要的(或者为了便于阅读以避免完全限定名称 - 无论您选择哪个原因)。在课程编写完成之后,他们会迷失方向。 – cklab

+0

谢谢,做出了澄清。 – arshajii

2

进口是语法糖,仅此而已。如果你真的想,你可以编写任何Java程序而不需要使用导入语句。例如,下面的类编译所有的本身:

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

此外,继承进口使它很多,很多更难从类中删除导入。例如,如果Bar.java继承自Foo.java,则可能无法从Foo删除导入而不将其添加到Bar。强制导入是显式的,这使得更改单个文件变得非常容易,而不用担心其他文件的影响,这几乎是Java和面向对象编程的基本原则。

(最后这一点是与那名a significant factor in the design of Go问题,它是专门试图避免在这一领域的C和C++的问题。)

+0

所以,你是说从Foo中删除导入将需要重新编译Bar,否则可能会失败。但是,为什么这是一个问题?让我们失败,让Bar的作者自己进口。这是他/他今天需要做的事情,对吧? – einpoklum

+0

在你提出的场景中,Foo进口Baz,Bar进口Foo,但也需要Baz。如果Foo想要删除Baz导入,那么Bar突然不再从Foo获得Baz,并且必须重写,而不仅仅是重新编译。那就是问题所在。 –

+0

这是怎么回事?假设Bar从Foo继承了一个方法,并且从Foo中移除了moethod。这也需要重写。与Faz继承巴兹一样的东西。一旦你将进口与班级联系起来,这就变得合理了。恕我直言。 – einpoklum

1

有每个文件明确指定的进口提高了可读性。想象一下打开一个文件,一眼就看不到依赖关系,因为导入是从另一个文件继承的。

+0

我不需要想象它,我在现实生活中有这样的想法:在大多数其他语言中,您“导入”自己“导入”其他内容的事物,例如,包含C和C++文件。 – einpoklum

+0

...并有70个进口并不是真正的可读性胜利(除非你是编译器当然)。 – einpoklum