2015-06-22 40 views
2

考慮一個包層次結構folder1/hi。 folder1包含B.java,並且hi包含A.java。包語句和.java文件的目錄之間的關係?

B.java:

package hi.a12.pkg; 
public class B { } 

A.java:

package a12.pkg; 
public class A {B b; } 

現在B.java編譯成功,但A.java沒有。

由於兩者應該在同一位置生成類文件。因此,他們應該能夠在沒有進口聲明的情況下找到彼此。

但還是說它沒有找到B類。

任何建議措施......還是怎麼回事錯..

+0

你到底是如何編譯它們以及從哪裏編譯的? (我強烈懷疑你只是從錯誤的地方編譯它們......) –

+1

看起來你的包名稱與你的文件夾層次結構不匹配。 'hi.a12.pkg.B'應該在'[some prefix]/hi/a12/pkg/B.java'中。我不明白爲什麼你不使用A的相同包前綴。 – hexafraction

+0

編譯B.java後,我使用cmd命令從hi文件夾編譯A.java:javac -cp。 -d。 A.java – Ronaldo7

回答

1

考慮一個包層次文件夾1 /喜。 folder1包含B.java和 嗨包含A.java。

所以B.javafolder1A.java是一個名爲hi文件夾中。到現在爲止還挺好。

B.java看起來是這樣的:

package hi.a12.pkg; 
public class B { } 

哎呀。 B.java表示它位於名爲hi.a12.pkgpackage中,但它在磁盤上的物理位置是folder1。這就是問題所在。將您的文件放在package聲明所指的文件夾中,否則其他班級將無法找到它們。

一個快速的方法來理解這個概念和解決您的問題將是:

  1. 更改packageB.java聲明package folder1;
  2. 更改package聲明A.javapackage folder1.hi;
  3. importBA.javapackage後聲明爲import folder.B;
  4. 編譯B.java從上面folder1一個目錄javac folder1\B.java
  5. 編譯A.java從上面folder1一個目錄javac folder1\hi\A.java

你可以在Oracle documentation

+0

我認爲包名僅用於指定應創建類文件的位置。因此,在hi> a12> pkg> B中創建B.class文件。所以這裏不應該有任何問題 – Ronaldo7

+0

@ Ronaldo7這是一個不正確的理解。 'package'名稱是類的完全限定名稱的一部分。當你編譯一個具有'package'名字的''''類時,''''類的完全限定名是'packagename.classname'。這就是'Java'具有導入語句的原因。所以你不必在代碼中的任何地方編寫'packaganame.classname',你可以在導入類後使用簡寫。請嘗試我的建議。 – CKing

+0

@ Ronaldo7既然你是新來的,請閱讀:[當有人回答我的問題時我應該怎麼做](http://stackoverflow.com/help/someone-answers)。接下來,通過[this](https://docs.oracle.com/javase/tutorial/java/package/managingfiles.html)全面介紹一家非常傑出的公司,它恰好也是Java語言的當前所有者。如果您還有關於如何運行該程序的問題超出了當前問題的範圍,請在該網站上發佈新問題,並且很樂意幫助您回答該問題 – CKing

-1

中看到它有幾個問題。

首先,它看起來像你的軟件包命名錯誤的方式。嘗試

爲A.java(它應該在目錄..../包裝/ A12):

package pkg.a12; 

爲B.java(必須在目錄... /包裝/ A12/HI):

package pkg.a12.hi; 

其次,你的文件A.java需求要說其中B位於使用import語句:

package pkg.a12; 
import pkg.a12.hi.B; 
public class A {B b; } 

第三,當你編譯你必須高於PKG文件夾中,並指的完整路徑:

javac pkg/a12/A.java 

這也將編譯B.java

+0

如果你忽略了這部分的問題,這裏是:* folder1包含B.java,並且hi包含A.java。*。現在當你說*首先,看起來你的軟件包被命名爲錯誤的方式*,我相信你意識到軟件包的命名方式是無關緊要的。 – CKing

+0

好點 - 謝謝,Chetan。我做了我經常做的事,閱讀代碼而不是「評論」,假設真實意圖在代碼中。但它可能不是,你的回答在處理這種差異方面更好。我試圖涵蓋更廣泛的情況,包括缺乏進口情況和彙編不正確的可能性。 – johnsgp

+0

關於導入的好處。我忽略了它。然而,主要的問題是OP從問題的前幾行很明顯地理解計算機上「包」和物理位置之間的關係。 – CKing

相關問題