通配符被称为导入包中的所有类。"它不会导入子包、字段或方法。" 这是什么意思?

3
在Sybex书籍《OCA Oracle Certified Associate Java SE 8 Programmer I - Study Guide》第1章的第10页上,指出了以下内容:
* 是一个通配符,匹配包中的所有类。当Java编译程序时,java.util包中的每个类都可用于此程序。它不导入子包、字段或方法;它仅导入类。(好的,现在只有类,但还有一种特殊类型的导入叫做“静态导入”,它可以导入其他类型。您将在第4章中了解更多信息)
我曾天真地认为由于类包含成员(字段和方法),因此这些成员也被隐含地导入了。然而,根据本书的作者的说法,情况似乎更加复杂。
如果您正在导入一个类,但没有访问该类的成员,那么导入该类有什么意义呢?

1
它说“java.util包中的每个类都可用”,意味着可以通过类的简单名称进行完全使用。它并没有涉及访问权限。导入不会影响访问权限,只会影响源代码中的名称。 - Lew Bloch
1
@EbonyMaw 导入(静态或普通)只是为了方便你。编译器仍然会在所有地方使用完全限定的类名。 - Eugene
那么对于java.lang.*,你可能会遇到Integer.MAX_VALUE和Long.MAX_VALUE的问题。顺便说一下,这是类变量的示例,对于实例变量,你需要使用new关键字。 - HRgiger
2个回答

2

导入那个类有什么意义?

想象一下,如果你不在java.util中导入类。如果你想创建一个Map,你需要输入:

java.util.Map<String, Integer> myMap = new java.util.HashMap<>();

如果您像这样导入该包中的类:import java.util.*;
Map<String, Integer> myMap = new HashMap<>();

如果您正在导入一个类,但您无法访问该类的成员,则导入对访问权限没有任何影响,它们都是关于可读性和方便性的。您不必键入那么多内容,第二个声明更易读,但您可以在两种情况下使用相同的myMap方法。
书中提到的静态导入(来自文档):
静态导入声明类似于普通导入声明。普通导入声明从包中导入类,允许它们在不进行包限定的情况下使用,而静态导入声明从类中导入静态成员,允许它们在不进行类限定的情况下使用。
静态导入的一个很好的例子是在单元测试中使用Mockito。在没有任何导入的情况下,您可以验证一些行为,例如:
org.mockito.Mockito.verify(mock, org.mockito.Mockito.never()).someMethod();

如果您使用普通导入import org.mockito.Mockito;
Mockito.verify(mock, Mockito.never()).someMethod();

而且使用静态导入 import static org.mockito.Mockito.*;,您可以输入
verify(mock, never()).someMethod();

在这里,即使没有指定类(Mockito),也可以使用verifynever 静态方法。


2

如果你导入了一个类,但你无法访问该类的成员,那么导入该类有什么意义呢?

假设你有一个包com.ebony.maw.utils,这个包里有一个名为MyUtilities的类,这个类有一个静态方法findFizgigs()。 如果你说

import com.ebony.maw.utils.*;

现在你可以说

MyUtilities.findFizgigs("thingy-002");

不需要说

com.ebony.maw.utils.MyUtilities.findFizgigs("thingy-002");

但是你仍然不能说
findFizgigs("thingy-002");

不使用类名。这就是导入类而不导入方法的意思。这只是意味着你可以使用类名而不必提供包名前缀。但你仍然可以使用该方法--只需提供类名作为前缀即可。


啊...原来是这个意思! :) 非常详细的逐步解释! - Ebony Maw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接