包中的基类和派生类
当我在同一目录中创建基类和派生类而未指定任何包时,它们编译得很好,但将它们添加到包会导致派生类中出现错误,说它不能够发现他是基类的象征。这个错误是令人沮丧的,因为我之前一直在c中工作,为什么所有这些在Java中使用shenanigans呢?包中的基类和派生类
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 *************
[email protected]:~/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不需要搜索更多文件。
哦,那有用!!谢谢,但我不知道为什么我必须先上一层来为此编译任何好的理由? Test_class编译得很好也许是因为它是独立的。 – dasman 2011-02-06 04:12:23
您需要从正确的包中导入包。以前,您一直在定义和从“默认”(未声明/未命名)包导入,但现在您正在定义TestPackage中的类,因此您需要从TestPackage导入。
例如: - 在同一个包中定义import TestPackage.Test_class;
我添加了该行,它表示Testpackage不存在。只需重申一次,这两个源文件都位于我的home文件夹中的Testpackage目录中。 Test_class编译没有任何问题。 – dasman 2011-02-06 04:00:52
同一包中的类不需要导入(或自动导入)。 – 2011-02-06 04:00:54
类不需要进口。我会怀疑你没有与你正在构建的软件包相匹配的目录树中的源文件...但是我明白你是这么做的。还请检查以确保您的类路径设置正确。
看中途下来此页面了解更多:http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html
而且先建基类。
将类放入包中后,必须确保正确设置类路径才能在正确的位置找到类。
例如,如果您不使用类路径,那么您的类路径将被视为“。”。 (即当前工作目录是类路径中唯一的目录)。所以当你编译没有包声明的类时,它会把类文件放在当前目录中,然后当它们查找它们时,它会成功在你的类路径中找到它们。然后,如果您添加了包声明并编译它们,编译器将在“./Testpackage”中查找这些包并且找不到它们(因为编译器仍然将类文件放在当前目录中)。
简单的解决方案是将包声明添加到类中时,也将它们移动到反映该包的目录中,即“./Testpackage”。然后用“Testpackage/*。java”调用编译器。如果您希望这些类位于默认包中,请删除包声明并将该类移回“。”。
是TestPackage你自己的包还是它提供的一些API来允许你测试你的代码? – palAlaa 2011-02-06 03:53:03