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

Posted

技术标签:

【中文标题】在 Java 的默认包中导入类的语法是啥? [复制]【英文标题】:What's the syntax to import a class in a default package in Java? [duplicate]在 Java 的默认包中导入类的语法是什么? [复制] 【发布时间】:2011-01-03 01:29:23 【问题描述】:

是否可以在 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 怎么引用?

【问题讨论】:

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

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

来自Java language specification:

这是一个编译 导入类型的时间错误 未命名的包。

【讨论】:

啊,很好的答案。简洁,正确,足够详细,没有多余的信息。我认为这是我从 JLS 获得的最后三个答案;可能是时候从头到尾阅读了。 从默认包导入到默认包的类怎么办? @ConductedClever 这将是多余的。无需导入。【参考方案2】:

访问默认包中的类的唯一方法是从默认包中的另一个类。那样的话,不用import了,直接参考就好了。

【讨论】:

这其实是这个问题的正确答案。【参考方案3】:

这是不可能的。

另一种方法是使用反射:

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

【讨论】:

假设该类位于 CLASSPATH 的包中。如果它在 CLASSPATH 中,Eclipse 会找到它,而受训者不必询问。 @Kelly,你确定吗? 这将导致NullPointerEsception,因为空对象参数。 @KellyS.French 否。该类不在当前包中,无法导入。 Eclipse 帮不上忙。 @EJP 那是我的观点。如果当前类加载器未提及(可达?)所需的类,那么尝试使用 Class.forName 将无济于事。您需要做的是实例化一个新的类加载器,该类加载器已提供类文件的路径,如类文件或 JAR 等,并使用该类加载器来请求所需的类。假设如果该类在默认包中,那么它应该可以按照 Oscar 提到的方式加载。【参考方案4】:

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

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

【讨论】:

这不是“坏习惯”:这是不可能的。【参考方案5】:

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

如果你对另一个包这样做,那么它应该是一个编译错误。

【讨论】:

这是不正确的。没有语法允许您在import 语句中命名默认包中的类。您可以从默认包中的另一个类中引用默认包中的一个类而不导入它,但这不是问题所要问的。 (这也不是你的回答字面意思!)

以上是关于在 Java 的默认包中导入类的语法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在使用 WebWorker 时,从导入其他类的文件中导入类会导致 Angular 8 编译失败

如何禁用模块中导入类的自动linting?

Typescript:如何从 javascript 文件中导入类?

java如何在指定目录中导入类

在 JSP 文件中导入类

Python:如何禁止从模块中导入类?