【问题标题】:How to access a class whose .java file has no package statement?如何访问其 .java 文件没有包语句的类?
【发布时间】:2014-06-23 00:43:56
【问题描述】:

我只是对某事感到好奇。假设我有以下环境:

文件夹结构-

projects \ prj1 \ src \ pkgs \ main (contains Main.java)
                             \ test (contains TestClass.java)

Main.java -

package pkgs.main;

import pkgs.test.TestClass;

class Main {
    public static void main(String[] args) {
        TestClass tc;
    }
}

基于 Java shell 的编译命令 -

javac -d ..\cls -sourcepath ..\src ..\src\pkgs\main\Main.java
java -classpath ..\cls pkgs.main.Main

如果我创建一个名为 Default.java 的 .java 代码文件,它没有包语句 -

public class Default {}

把这个文件放到src文件夹下,Main.java这样的类文件怎么访问这个Default类呢?我尝试使用以下 import 语句,但都不起作用,导致编译错误:

Main.java -

package pkgs.main;

// import Default;    (causes many compilation error messages)
// import .Default;   (causes "identifier expected" compilation error)

我还将 Default.java 文件从 src 文件夹移到包含 Main.java 的同一文件夹中,但这也不起作用。我很欣赏这整个想法似乎是糟糕的设计,但我这样做只是为了更多地了解包和导入语句的工作原理,以及项目文件夹结构。谢谢。

【问题讨论】:

  • 您是否尝试过只使用Default而不导入它?如果Default 也在您要导入的某个包中,那将无法正常工作,但我认为没有办法解决这个问题 - 这只是始终使用包的另一个原因。
  • 一旦你给一个类一个包,任何没有显式导入的类都将被假定在同一个包中。所以不,默认包中的一个类只是变得“不可见”,我想不出一种方法可以解决这个问题。也不是你为什么想要。
  • @Jon Skeet,我确实尝试过;显示的错误消息是“找不到符号”。另外,我尝试将 Default.java 类文件移动到与 Main.java 相同的文件夹中,但这会产生“无法访问默认/错误源文件”错误消息。
  • 有趣 - 我期望可以工作,但如果没有,我只想说你需要为Default 使用一个包。这将比试图让它工作简单得多,IMO。我不会花时间担心无论如何都应该避免的情况。
  • @Jon Skeet,当然。我只是在尝试学习 XP ;)

标签: java import package


【解决方案1】:

为了避免两步间接,接受答案的本质是according to the specification

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

这意味着如果您不在未命名(也称为默认)包中,则无法访问未命名/默认包unless you are prepared to turn to reflection 中的类。

但是,如果您在未命名/默认包中,则不需要导入任何内容,只是不要忘记设置类路径,例如javac -cp "." ABC.java

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 2012-01-06
    • 2014-06-09
    • 1970-01-01
    • 2018-06-12
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多