为什么导入类不导入其所有依赖项?

时间:2016-05-11 18:40:05

标签: java import

如果我想在代码中使用ArrayList,我需要导入java.util.ArrayList。如果我还想使用List,我必须导入java.util.List。为什么需要这个? ArrayList继承自List,因此使用其中的代码。为什么这不会延续到我的班级?当然,如果ArrayList导入List,而我的班级又会导入ArrayList,那么我的班级应该定义List吗?

7 个答案:

答案 0 :(得分:5)

import只是一种语法功能,可以避免每次使用类名时都写出完整的包。

您根本不需要导入依赖项。

答案 1 :(得分:2)

某些类依赖于很多类,并且这些类依赖于很多类,并且最终会导致在JDK上导入一个很好的部分。它不能假设您可能想要导入哪些类/接口。

如果您使用IDE,它可以为您添加导入,这样您就不必担心大多数时间需要哪些导入。

答案 2 :(得分:1)

import关键字实际上并不“导入”任何内容:它只是告诉编译器您希望通过其短名称来引用某些内容。这就是为什么ArrayList类中的“import List”对你的类没有影响。

答案 3 :(得分:0)

您可以从特定包中导入所有内容,如下所示:synchronized

请记住,这样做时会有一个特别的烦恼,因为您需要完全限定可能与导入的包共享相同类名的其他对象。请查看此参考:

Why is using a wild card with a Java import statement bad?

答案 4 :(得分:0)

是和否。 ArrayList对象确实可以访问它扩展/实现的类中定义的任何属性(方法,对象...)。但是,你所在的班级并不了解这样的超级班级。您必须明确导入它们才能引用它们。您当然可以导入java.util.*,这样您的班级就可以访问该软件包中的所有类。

答案 5 :(得分:0)

这是“声明正在使用的内容”的明确实例。您可能会认为这是“需要知道”的遥远变体。

使用“ArrayList”并不要求您也使用“List”。 但是,如果要使用“java.util.List”(例如,作为使用“ArrayList”实例初始化的变量的类型), 那么你显然应该说你正在使用这两种类型。 (或者实际上,只是消除了所使用的简单名称所指的内容,例如“List”。)

为什么使用您正在使用的任何类的任何可能的父类型和接口来混乱您的导入部分(即使隐式完成)? 在同一时间,可能不会提供太多的好处 如果您想要使用具有相同名称的其他类(其他包),它会更加努力。

当然,你可能还记得你根本不需要使用“进口”。您将需要使用类的全名,然后, 但这样做完全有效。

此外,当使用基于表达式上下文中也使用的简单名称时,大多数现代IDE将建议正确导入。 (例如,如果从“ArrayList”分配时使用“List”作为变量类型,则可能会建议“java.util.List”作为“List”的结果,其优先级高于其他名为“List”的clases。

答案 6 :(得分:0)

我完全同意你的问题。如果我们不必担心跟踪长导入语句列表,编写代码会容易得多。

但是,java(编译器和运行时)的工作方式,我认为有必要这样做,因为以下内容。

Java中的import语句仅适用于编译器。运行时对import语句一无所知。

编译代码时,编译器会将您使用的所有类名转换为完全限定的类名。如果我们明确没有提到我们引用的类,如果有多个类与您提供的相同类名匹配,编译器可能会感到困惑。

你可以这么说,java应该至少自动导入非重复的类。但问题是你永远不知道哪些类不重复。

任何人都可以使用任何名称创建一个类(我甚至可以在我自己的包中创建一个名为ArrayList或List的类)。因此,编译器需要事先知道是否必须将List解析为java.util.List或其他一些List。