如果我从另一个包导入并使用一个类,它是否包含包中的所有文件?
例如,如果我只使用名为MyFunctions的mylibrary包中的一个类,那么以下是否包括所有类?
import my.example.mylibrary.*;
与之相比:
import my.example.mylibrary.MyFunctions;
答案 0 :(得分:4)
否强>
导入不包含任何内容。
使用时加载类,而不是之前加载。所以import
唯一能帮助你避免输入整个类名。
例如,键入(和读取)更好:
import my.example.mylibrary.SomeClass;
import java.util.List;
import java.util.ArrayList;
...
SomeClass some = new SomeClass();
List<SomeClass> list = new ArrayList<SomeClass>();
list.add( some );
etc..
大于
// no import
...
my.example.mylibrary.SomeClass some = new my.example.mylibrary.SomeClass();
java.util.List<my.example.mylibrary.SomeClass> list = new java.util.ArrayList<my.example.mylibrary.SomeClass>();
list.add( some );
然而,他们表现完全一样。
另外,请记住使用
import some.packagename.*;
VS。
import some.packagename.Each;
import some.packagename.Single;
import some.packagename.Class;
import some.packagename.ByLine;
具有完全相同的性能,除了第一个更快(和更脏),第二个更清晰。
始终!! use the second form in production and/or when someone else needs to see your code.
答案 1 :(得分:2)
“包含”是什么意思?
两者在性能上没有差别。他们唯一能做的就是让你一直写MyFunctions
而不是my.example.library.MyFunctions
。
当您第一次使用该类时,类加载器将(通常)加载.class
文件。当.class
位于.jar
文件中时,它可能会加载更多。但这并不取决于您编写import
的方式。
答案 2 :(得分:2)
导入语句只是编译器的一个指令,用于帮助它使用非限定类名解析对类的引用 - 不再是。
例如,每个类都隐式导入java.lang.*
,这意味着您可以引用String
而不是java.lang.String
和Integer
而不是java.lang.Integer
等。
如果您有mypackage.A
和mypackage.B
以及import mypackage.A
,则可以在课程中使用A
,但必须使用mypackage.B
而不是{{1} }}
使用B
而不是特定的类名只是告诉编译器允许包中的所有类而不是特定的类。因此*
允许您在代码中使用import mypackage.*
和A
。
答案 3 :(得分:1)
如果您专门导入MyFunctions,编译器仍然不会知道MyOtherFunctions。 *版本将导入包中的所有内容。