Java中如何导入默认包中的类的语法是什么?

83

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

package foo.bar;

public class SomeClass {
    // ...

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

package baz.fonz;

import foo.bar.SomeClass;

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

在另一个文件中。但是如果SomeClass.java没有包声明,你该如何在AnotherClass中引用SomeClass


1
我相信你只是在引用它。如果它们在默认包中,那么它们必须在同一个目录中(或者至少在类路径上)。 - Topher Fangio
1
@Thorbjørn:我现在正在参加培训课程,五分钟的试探后没有人知道该怎么做。最初,讲师试图说明Eclipse可以通过一次点击添加缺失的导入语句,但是该工具无法识别没有包的类。 - Pops
@mmyers:嗯,我对此持谨慎态度,因为我对Groovy一无所知。即便如此,看起来我的SO搜索技巧失败了。谢谢! - Pops
每个类都有一个包。如果您没有声明包,它将被添加到“默认”包中,如下所示:“import default.Foo”。自动包含的类在java.lang中,可以显式导入“import java.lang.String”,但这是多余的。 - Kelly S. French
我认为标题有点误导人:“从默认包中导入一个类”会更好(我不是母语为英语的人,可能是错的)。 - user85421
显示剩余2条评论
5个回答

160

无法从默认包中导入类。除了非常小的示例程序外,应避免使用默认包。

根据Java语言规范

从未命名的包导入类型是编译时错误。


6
啊,很棒的回答。简明扼要、正确,详情恰到好处,没有多余的信息。我想这使我的最后三个答案都来自《Java语言规范》,也许是时候将其从头到尾地阅读一遍了。 - Pops
从默认包导入到默认包的类怎么办? - ConductedClever
1
@ConductedClever 这将是多余的。不需要导入。 - user207421

59

访问默认包中的类的唯一方法是从默认包中的另一个类中进行访问。在这种情况下,不需要担心import它,只需直接引用即可。


4
这实际上是这个问题的正确答案。 - calbertts

18

那是不可能的。

替代方案是使用反射:

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

假设类在CLASSPATH的包中。如果它在CLASSPATH中,Eclipse会找到它,学员们就不必再问了。 - Kelly S. French
7
@Kelly,你对此十分确定吗? - Thorbjørn Ravn Andersen
由于空对象参数,这将导致“NullPointerEsception”。 - user207421
@KellyS.French 不行。这个类不在当前包中,也无法被导入。Eclipse 无能为力。 - user207421
@EJP,那就是我的观点。如果当前类加载器没有提及(可达?)所需的类,则尝试使用Class.forName是无济于事的。您需要做的是实例化一个新的类加载器,并为其提供指向类文件的路径,例如在类文件或JAR等中,并使用该类加载器请求所需的类。假设如果类在默认包中,则应该可以按照Oscar所述的方式进行加载。 - Kelly S. French
这确实有效 - 至少对我来说,在使用Java 8时是这样的。 - Rhubarb

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

1
这不是“不好的做法”:这是不可能的。 - user207421

4

这并不是编译错误!你只能将默认包导入到默认包类中。

如果你对另一个包执行此操作,则会出现编译错误。


3
这是不正确的。没有语法可以让你在“import”语句中命名默认包中的类。你可以在默认包中的另一个类中引用默认包中的类而无需将其导入,但这不是问题所询问的内容。(而且这也不是你的答案字面上所说的!) - Stephen C

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