在 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 编译失败