当我在同一目录中创建基类和派生类而不指定任何包时,它们编译得很好,但是将它们添加到包中会导致派生类出错,指出它无法找到基类的符号。这个错误令人沮丧,因为我以前一直在使用 c 语言工作,为什么在 Java 中出现所有这些恶作剧?
package Testpackage; // If I comment this then derived class compiles fine
public class Test_class{
int x,y;
public static Integer angle;
public Test_class(int a,int b)
{
x = a;
y = b;
}
public Integer product()
{
return x*y;
}
}
*************Derived class ****************
package Testpackage; // If I comment this then it compiles fine
public class Derived_class extends Test_class{
Integer vol;
Test_class I = new Test_class(1,2);
public Derived_class(){
super(9,10);
vol = 0;
}
public Integer volume()
{
vol = this.product();
return vol;
}
}
********* output *************
assa@dasman-laptop:~/Testpackage$ javac Derived_class.java
Derived_class.java:4: cannot find symbol
symbol: class Test_class
public class Derived_class extends Test_class{
^
Derived_class.java:7: cannot find symbol
symbol : class Test_class
location: class Testpackage.Derived_class
Test_class I = new Test_class(1,2);
^
Derived_class.java:7: cannot find symbol
symbol : class Test_class
location: class Testpackage.Derived_class
Test_class I = new Test_class(1,2);
^
Derived_class.java:15: cannot find symbol
symbol : method product()
location: class Testpackage.Derived_class
vol = this.product();
最佳答案
使用包时,您应该从包层次结构的根目录调用编译器(在您的情况下为 ~
)。
所以,向上一个目录,然后这样调用 javac:
javac TestPackage/Derived_class.java
然后编译应该可以工作了。为了执行,您将使用:
java TestPackage.Derived_class
(但是你的类还没有任何主要方法。)
编辑:为什么这是必要的?当 javac
搜索从您的类中引用的类时,它会根据它们的包进行搜索。您的 Derived_class 引用了类 TestPackage.TestClass
,这将在 TestPackage/TestClass.java
(或 .class
)(相对于类路径,此处由您的工作目录组成)。当您已经在 TestPackage 目录中时,不存在这样的目录。
另一种在这里调用它的方法是使用
javac -cp .. Derived_class.java
从那时起,javac 就会从父目录中搜索相关的类。然后您还应该设置“-d”参数以将生成的类文件放入正确的结构中。调用 javac -help
以获得选项的摘要,或查看您的 JDK 文档以获得所有选项的更详细描述。
当你只编译一个文件时,这并不重要,因为要编译的文件是在命令行上给出的,javac 不需要搜索更多的文件。
关于java - 包中的基类和派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911406/