我在同一个文件夹中有两个类:
- First.java
- Second.java
一流的实现:
package mypackage;
public class First {
public static void main(String[] args) {
Second.myMethod();
}
}
二级实施:
public class Second {
public static void myMethod() {
System.out.println("this is the second class");
}
}
第二个已经被编译,所以它变成了:
- First.java
- Second.java
- 二等
当我尝试编译First.java时:javac-cp-d首先.java
我得到一个错误:
cannot find symbol
Second.myMethod();
^
symbol: variable Second
location: class First
1 error
我试过:;javac-d.*。java";我得到了相同的结果
起点
你展示了两个类定义。。
- 这里是First,它属于package"mypackage":
package mypackage; public class First { public static void main(String[] args) { Second.myMethod(); } }
- 这里是Second,它没有包装声明:
public class Second { public static void myMethod() { System.out.println("this is the second class"); } }
如果你试图将它们一起编译,你会得到如下编译错误(OpenJDK 18.0.1.1(:
% javac *.java
First.java:5: error: cannot find symbol
Second.myMethod();
^
symbol: variable Second
location: class First
1 error
为什么它不起作用
从7.4.2。未命名包:
没有包声明的编译单元是未命名包的一部分
Java SE平台提供的未命名包主要是为了在开发小型或临时应用程序或刚开始开发时提供方便
这描述了";第二个"-没有包声明的编译单元。JLS 7.4.2告诉我们这个类将属于一个未命名的包。此外,我们可以看到,未命名的包并不打算用于任何内容。
从7.5开始。进口申报:
如果不使用适当的导入声明,引用另一个包中声明的类型或另一类型的静态成员的唯一方法是使用完全限定名称(§6.7(。
这告诉我们,在First.java中,如果我们希望引用另一个包中定义的类型,我们需要使用我们希望引用的类型的完全限定名称。
这就是你试图做的——首先是在命名包中";mypackage";,第二个在一个未命名的包中。为了让First看到Second,First需要为Second使用一个完全限定的名称。但Second并没有完全限定的名称——它属于一个未命名的包;它没有名字,所以不可能引用它。
解决方案1
Edit Second–将其从未命名包移动到命名包";mypackage";把这个放在最上面:CCD_ 1。这样一来,First和Second将属于同一个名为的包,编译将成功。
解决方案2
Edit First–将其从命名的包中移出"mypackage";通过注释掉或删除这一行:package mypackage;
来添加到未命名的包。这样,您就完全删除了命名包,将First和Second都保留在未命名包中,编译就会成功。