【问题标题】:Using Classes within the same named package in Java在 Java 中使用同名包中的类
【发布时间】:2019-10-01 11:02:35
【问题描述】:

我正在尝试创建两个类 A 和 B,它们存在于名为 components 的命名包中。 A 是公共类 Window,B 是公共类 Door,其中包含 A 的一个实例。问题是在编译 B 时使用

javac -classpath . Door.java

,B 找不到 A。

我知道我可以让这段代码在没有导入子句的未命名默认包中工作,但是我希望这些文件存在于一个命名类中,以便可以将它们导入其他地方。

我已经向自己证明,如果 package components; 行从两个文件中被注释掉,Door.java 将编译,但我确实希望将其作为一个名为 components 的包。

我也尝试在 B 中使用import components.Window;,但这也不起作用。

//class A
package components;
public class Window{
public void rollup(){}
public void rolldown(){}
}

//class B
package components;

public class Door{
    public Window window = new Window();
    public void open(){}
    public void close(){}
}

我当前的代码显示了这表明包 B 当前无法访问包 A。

Door.java:8: error: cannot find symbol
        Window window = new Window();
        ^

如何修复此代码以允许 B 在同一个命名包中创建 A 的实例?

【问题讨论】:

  • 你编译Window.java了吗?
  • 您必须在包含这两个类的文件夹的父级中执行命令javac -sourcepath . components/Door.java。例如,如果您有 Project/components/Door.java,则必须从文件夹 Project 运行命令。
  • 你不能只改变你需要的包名,你需要将类移动到一个名为 components 的目录中

标签: java class package


【解决方案1】:

以下结构为参考

/some/base/route/project/components
                          |- Window.java
                          |- Door.java

然后,运行javac -classpath . components/Door.java(以及javac components/Door.java/some/base/route/project应该可以工作。

请注意,您需要从开始符合类的完全限定包名称的目录的第一级向上运行命令。这意味着,如果您从 /some/base/route/project/components 中运行该命令,它将不起作用。

最后,在Door 类中添加import components.Window; 是没有用的,因为Window 已经在Door 中可见,因为这两个类都在同一个包中,并且Window 被声明为public

【讨论】:

  • 是的,完美。经验教训 - 我需要从上面目录中的终端调用 javac。这是学习 java 的一个有趣的怪癖!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多