当我在同一目录中创建基类和派生类而没有指定任何包时,它们编译得很好,但是将它们添加到包导致派生类中的错误,说它无法找到基类的符号。这个错误很令人沮丧,因为我以前一直在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();
答案 0 :(得分:2)
使用包时,应该从包层次结构的根目录(在您的情况下为~
)中调用编译器。
所以,进入一个目录,然后以这种方式调用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不需要搜索更多的文件。
答案 1 :(得分:0)
使用软件包,您需要从正确的软件包导入。以前,您一直在使用“默认”(未声明/未命名)包中的和进行定义,但现在您要在TestPackage中定义类,因此您需要从TestPackage导入。
例如:import TestPackage.Test_class;
答案 2 :(得分:0)
不需要导入在同一个包中定义的类。我怀疑你没有与你正在构建的包相匹配的目录树中的源文件......但是我知道你这样做了。还要检查以确保您的类路径设置正确。
在此页面中间查看更多内容:http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html
首先构建基类。
答案 3 :(得分:0)
将类放入包后,必须确保正确设置类路径以在正确的位置找到类。
例如,如果您不使用类路径,那么您的类路径将被视为“。” (即当前工作目录是类路径中唯一的目录)。因此,当您编译没有包声明的类时,它会将类文件放在当前目录中,然后在查找它们时,它会在类路径中成功找到它们。
然后,如果你添加包声明并编译它们,编译器将在“./Testpackage”中查找包而不找到它们(因为编译器仍然将类文件放在当前目录中)。
简单的解决方案是将包声明添加到类中,也将它们移动到反映该包的目录中,即“./Testpackage”。然后使用“Testpackage / * .java”调用编译器。如果希望类在默认包中,请删除包声明并将类移回“。”。