2011-02-06 112 views
3

当我在同一目录中创建基类和派生类而未指定任何包时,它们编译得很好,但将它们添加到包会导致派生类中出现错误,说它不能够发现他是基类的象征。这个错误是令人沮丧的,因为我之前一直在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(); 
+0

是TestPackage你自己的包还是它提供的一些API来允许你测试你的代码? – palAlaa 2011-02-06 03:53:03

回答

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不需要搜索更多文件。

+0

哦,那有用!!谢谢,但我不知道为什么我必须先上一层来为此编译任何好的理由? Test_class编译得很好也许是因为它是独立的。 – dasman 2011-02-06 04:12:23

0

您需要从正确的包中导入包。以前,您一直在定义从“默认”(未声明/未命名)包导入,但现在您正在定义TestPackage中的类,因此您需要从TestPackage导入。

例如: - 在同一个包中定义import TestPackage.Test_class;

+0

我添加了该行,它表示Testpackage不存在。只需重申一次,这两个源文件都位于我的home文件夹中的Testpackage目录中。 Test_class编译没有任何问题。 – dasman 2011-02-06 04:00:52

+0

同一包中的类不需要导入(或自动导入)。 – 2011-02-06 04:00:54

0

将类放入包中后,必须确保正确设置类路径才能在正确的位置找到类。

例如,如果您不使用类路径,那么您的类路径将被视为“。”。 (即当前工作目录是类路径中唯一的目录)。所以当你编译没有包声明的类时,它会把类文件放在当前目录中,然后当它们查找它们时,它会成功在你的类路径中找到它们。然后,如果您添加了包声明并编译它们,编译器将在“./Testpackage”中查找这些包并且找不到它们(因为编译器仍然将类文件放在当前目录中)。

简单的解决方案是将包声明添加到类中时,也将它们移动到反映该包的目录中,即“./Testpackage”。然后用“Testpackage/*。java”调用编译器。如果您希望这些类位于默认包中,请删除包声明并将该类移回“。”。