2011-02-06 136 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」調用編譯器。如果您希望這些類位於默認包中,請刪除包聲明並將該類移回「。」。