在 Java 中将类导入默认包中的语法是什么?[复制]

What's the syntax to import a class in a default package in Java? [duplicate]

提问人:Pops 提问时间:1/9/2010 最后编辑:Stephen CPops 更新时间:11/3/2018 访问量:148178

问:

是否可以在 Java 中导入默认包中的类?如果是这样,语法是什么?例如,如果您有

package foo.bar;

public class SomeClass {
    // ...

在一个文件中,您可以编写

package baz.fonz;

import foo.bar.SomeClass;

public class AnotherClass {
    SomeClass sc = new SomeClass();
    // ...

在另一个文件中。但是,如果 SomeClass.java 不包含包声明怎么办?你会如何参考?SomeClassAnotherClass

Java 语法 导入

评论

1赞 Topher Fangio 1/9/2010
我相信你只是参考它。如果它们位于默认包中,则意味着它们必须位于同一目录中(或至少在类路径上)。
1赞 Pops 1/9/2010
@Thorbj ørn:我现在正在训练,戳了五分钟后没人知道该怎么做。最初,讲师试图说明 Eclipse 可以通过单击添加缺失的 import 语句,但该工具没有选择没有包的课程。
0赞 Pops 1/9/2010
@mmyers:嗯,我对此很警惕,因为我对Groovy的了解为零。即便如此,看起来我的 SO-search-fu 也失败了。谢谢!
0赞 Kelly S. French 1/9/2010
每个类都有一个包。如果您不声明该包,它将被添加到“默认”包中,如下所示:“import default.Foo”。自动包含的类位于 java.lang 中,可以显式导入“import java.lang.String”,但将是多余的。
0赞 user85421 1/9/2010
我认为标题有点误导:“......从默认包导入一个类...”会更好(不是以英语为母语的人,我可能是错的)

答:

161赞 Dan Dyer 1/9/2010 #1

不能从默认包导入类。应避免使用默认包,但非常小的示例程序除外。

Java 语言规范

这是一个编译 从 未命名的包。

评论

6赞 Pops 1/9/2010
啊,很好的答案。简明扼要,正确,细节恰到好处,没有多余的信息。我认为这是我在 JLS 中的最后三个答案;可能是时候从头到尾阅读它了。
0赞 ConductedClever 5/5/2017
如何从默认包导入到默认包的类?
1赞 user207421 10/11/2017
@ConductedClever 这将是多余的。无需导入。
59赞 Dan 1/9/2010 #2

访问默认包中的类的唯一方法是从默认包中的另一个类访问。在这种情况下,不要打扰它,直接参考它。import

18赞 OscarRyz 1/9/2010 #3

那是不可能的。

另一种方法是使用反射:

 Class.forName("SomeClass").getMethod("someMethod").invoke(null);

评论

0赞 Kelly S. French 1/9/2010
这假定该类位于 CLASSPATH 的包中。如果它在 CLASSPATH 中,Eclipse 就会找到它,而受训者就不必问了。
7赞 Thorbjørn Ravn Andersen 2/13/2011
@Kelly,你确定吗?
0赞 user207421 10/11/2017
这将导致 because of the null 对象参数。NullPointerEsception
0赞 user207421 10/11/2017
@KellyS.法文号该类不在当前包中,无法导入。Eclipse 无能为力。
0赞 Kelly S. French 10/14/2017
@EJP这就是我的观点。如果当前类加载器没有提到(可访问?)所需的类,那么尝试使用 Class.forName 将无济于事。您需要做的是实例化一个新的类加载器,该类加载器已提供类文件的路径,如类文件或 JAR 等,并使用该类加载器请求所需的类。假设如果该类位于默认包中,那么它应该可以按照 Oscar 提到的方式加载。
6赞 Rob H 1/9/2010 #4

正如其他人所说,这是不好的做法,但是如果您因为需要与使用默认包的第三方库集成而别无选择,那么您可以在默认包中创建自己的类,并以这种方式访问其他类。默认包中的类基本上共享一个命名空间,因此即使另一个类驻留在单独的 JAR 文件中,您也可以访问它。只需确保 JAR 文件位于类路径中即可。

如果您的类不在默认包中,则此技巧不起作用。

评论

1赞 user207421 10/11/2017
这不是“坏习惯”:这是不可能的。
4赞 vishal rajput 8/11/2013 #5

这根本不是编译错误!您只能将默认包导入到默认包类。

如果对另一个包这样做,则应为编译错误。

评论

3赞 Stephen C 11/3/2018
这是不正确的。没有任何语法允许您在语句中命名默认包中的类。您可以从默认包中的另一个类引用默认包中的类,而无需导入它,但这不是问题所要问的。(这也不是你的答案字面意思!import