JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 請問關於package敘述的怪問題?
Java天下行





發文: 49
積分: 0
於 2004-03-26 22:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
假設有a.java b.java c.java這三個java檔..
它們的開頭敘述皆是package aa.bb;
c.java無a類和b類的物件...而b.java裡有c類的物件...而
a.java裡有b類和c類的物件..小弟把上述三個來源檔放在..
已建立好的aa\bb目錄下..首先先編譯c.java..可以產生class檔..
再來要編譯b.java時..就很奇怪了..它出現無法識別 c 宣告的
物件變數..我用Gel或命令提示字元javac來編譯都是出現這種訊息.
怪了..現在aa\bb目錄裡不是已有編譯好的c.class了..且..那要編譯b.java
應該找得到c.class才是啊..三個都在同個目錄下不是嗎?..
我試了很久..百思不得其解..但把package拿掉..全都可編譯完成..
實在是想知道為何加了..package敘述會產生這種情形呢??..能否請高手
指點一下..謝謝!~..


reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-03-26 23:41 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Java天下行 wrote:
假設有a.java b.java c.java這三個java檔..
它們的開頭敘述皆是package aa.bb;
c.java無a類和b類的物件...而b.java裡有c類的物件...而
a.java裡有b類和c類的物件..小弟把上述三個來源檔放在..
已建立好的aa\bb目錄下..首先先編譯c.java..可以產生class檔..
再來要編譯b.java時..就很奇怪了..它出現無法識別 c 宣告的
物件變數..我用Gel或命令提示字元javac來編譯都是出現這種訊息.
怪了..現在aa\bb目錄裡不是已有編譯好的c.class了..且..那要編譯b.java
應該找得到c.class才是啊..三個都在同個目錄下不是嗎?..
我試了很久..百思不得其解..但把package拿掉..全都可編譯完成..
實在是想知道為何加了..package敘述會產生這種情形呢??..能否請高手
指點一下..謝謝!~..


到 aa 所在的目錄下,編譯 a.java 即可。
1
javac aa\bb\a.java


順便看一下這一篇,或許有幫助:
http://www.javaworld.com.tw/jute/post/view?bid=29&id=39312&tpg=1&ppg=1&sty=1&age=0#39312


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
Java天下行





發文: 49
積分: 0
於 2004-03-27 12:24 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
..嗯..版主大人..感謝你的指點..總算是三個都可編譯過了..但用package aa.bb;敘述..不是表示..本身的來源java檔..要放在aa\bb下面..至於輸出的class不用說..一定也是放在aa\bb下面..但..我用Gel直接編譯時..c.java是可直接編譯過..但..b.java就無法編譯了..它就出現:

GoodBooks.java:13: cannot resolve symbol
symbol : class c
location: class aa.bb.b

這邊我想問的是..我的classpath也有.這路徑了..那為何Gel無法編譯過呢?..
而package敘述不是把編譯完的class輸出到指定的package裡嗎?..不太清楚package的敘述功用為何???....但用版主的文章裡的命令提示字元的確是讓我編譯過了...感謝!!~~...


reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
sungo

瘋狂口罩大盜



發文: 822
積分: 17
於 2004-03-27 13:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Java天下行 wrote:
但用package aa.bb;敘述..不是表示..本身的來源java檔..要放在aa\bb下面..

使用package敘述的原始檔不一定要放在package下才能編譯,
但是有一個原則:有package敘述的原始檔一定要先編譯,因
為import敘述需要package底下的*.class檔。而不同package間的
存取,access modifies要設為public,否則編譯會錯誤。

例如我在C槽底下有:Test.java、Out.java這2個原始檔。

Out.java:
1
2
3
4
5
6
package com.sungo;
public class Out {
    public void go() {
        System.out.println("套件輸出!!");
    }
}
Test.java
1
2
3
4
5
6
7
8
import com.sungo.Out;
public class Test {
    public static void main(String[] args) {
        Out a = new Out();
        a.go();  
        System.out.println("主程式輸出!");
    }
}

先編譯Out.java:
1
C:\>javac -d . Out.java

Out.class就會產生在C:\com\sungo\底下。

再編譯Test.java:
1
C:\>javac Test.java

Test.class會產在C:\底下。

執行Test.class的結果:
1
2
3
C:\>java Test
套件輸出!!
主程式輸出!


我以前有寫過一篇package的文章..
如果還是覺得觀念很模糊,可以參
考看看,全文檢索應該可以找的到...Smile


reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-03-27 15:42 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Java天下行 wrote:
..嗯..版主大人..感謝你的指點..總算是三個都可編譯過了..但用package aa.bb;敘述..不是表示..本身的來源java檔..要放在aa\bb下面..至於輸出的class不用說..一定也是放在aa\bb下面..但..我用Gel直接編譯時..c.java是可直接編譯過..但..b.java就無法編譯了..它就出現:

GoodBooks.java:13: cannot resolve symbol
symbol : class c
location: class aa.bb.b

這邊我想問的是..我的classpath也有.這路徑了..那為何Gel無法編譯過呢?..
而package敘述不是把編譯完的class輸出到指定的package裡嗎?..不太清楚package的敘述功用為何???....但用版主的文章裡的命令提示字元的確是讓我編譯過了...感謝!!~~...


有屬於某 package 的 class source 不一定要依照 package path 的結構(如果要,entry directory 是哪裡?),有依照 package path 放置的作法有好處,搭配 -sourcepath 可以在編譯時省事很多。

至於屬於某 package 的 class 編譯出來的 .class file 也不一定會放在 package path 結構下的目錄裡,如果編譯時你不使用 -d switch,編譯出來的 .class file 會放在 source file 同一目錄下,而不會自動放到 package path 結構中。上一點提到 source file 可以隨意放置在任一個路徑下,那麼編譯出來的 .class 就是在那路徑下(without -d switch)。

我習慣把 source file 和 .class file 依照 package 的結構放置,但這不代表 source(.java) 和 .class 是放在一起的,我個人 prefer 分開管理。如果你照這樣的方式管理,比如 %SOURCE% 這個目錄是所有 source files 的根目錄,而 %CLASSES% 是堆放 .class 的地方,那麼你可以在編譯時使用 -sourcepath 指向 %SOURCE%,-d 指向 %CLASS% 目錄,這樣在編譯一個 class: x.y.AAA 時需要參考 x.z.BBB 而 BBB 的 .class 不存在或在 classpath 上找不到,編譯器會依 -sourcepath 的指示試著去找出 %SOURCE%\x\z\BBB.java 來編譯,若找到會將編譯後的 BBB.class 放置在 %CLASSES%\x\z 目錄下。

等你充分體會 -sourcepath 帶來的好處之後,你甚至可以不靠 IDE,只要手動下 command 編譯一個檔案,便完成整個 project 的編譯,而不必擔心因為依存的關係,而要先編譯某些檔案後編譯某些檔案。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:請問關於package敘述的怪問題? [Re:Duncan]
talangniao





發文: 4
積分: 0
於 2004-12-18 08:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
您能起个简单的例子的吗??
新手 刚刚学习


reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:Duncan]
yaya





發文: 2
積分: 0
於 2005-06-18 11:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問如果我把 A.java 放在 C:/projects/com/example/model裡
然後在 A.java 第一行程式裡宣告 package com.example.model;
在 C:/projects/com/example/web 裡有一個 B.java , 它裡面的第一行程式
宣告 package com.example.web; 然後在第三行宣告 import com.example.model.*; 因為我要在 B.java 主程式中建立一個 a 類別的實體來呼叫a 類別的方法 .

於是我ms-dos裡輸入
C:\window>cd\projects\com\example\web\
C:\projects\com\example\web>javac A.java
Hello.java:3: package com.example.model does not exist
import com.example.model.*;
^
Hello.java:7: cannot resolve symbol
symbol : class A
location: class com.example.web.B
A h2 = new A();
^
Hello.java:7: cannot resolve symbol
symbol : class A
location: class com.example.web.B
A h2 = new A();
^
3 errors


reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:yaya]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2005-06-18 11:41 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
yaya wrote:
請問如果我把 A.java 放在 C:/projects/com/example/model裡
然後在 A.java 第一行程式裡宣告 package com.example.model;
在 C:/projects/com/example/web 裡有一個 B.java , 它裡面的第一行程式
宣告 package com.example.web; 然後在第三行宣告 import com.example.model.*; 因為我要在 B.java 主程式中建立一個 a 類別的實體來呼叫a 類別的方法 .


直接編譯 c:\projects\com\example\web\B.java
javac -d c:\projects -sourcepath c:\projects c:\projects\com\example\web\B.java


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
yaya





發文: 2
積分: 0
於 2005-06-20 20:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝版主,
可是當我輸入
C:\projects\com\example\web>java B
它竟然出現
Exception in thread "main" java.lang.NoClassDefFoundError: B (wrong name: com/example/web/B)

我嘗試輸入java -classpath B可是好像也沒啥用!!
(在此問一下為什麼版主要用javac -d C:\projects javac -d c:\projects -sourcepath c:\projects c:\projects\com\example\web\B.java
這裡的每個字是代表什麼意義列如:-d and -classpath??)


browser edited on 2005-06-20 20:53
reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2005-06-20 20:47 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在 projects 下跑 com.example.web.B 吧
關於 package,classpath 之類的詳細解釋, 請看精華區


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:請問關於package敘述的怪問題? [Re:Java天下行]
yalantw





發文: 3
積分: 0
於 2006-01-15 22:55 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我按照以下方法
直接編譯 c:\projects\com\example\web\B.java
javac -d c:\projects -sourcepath c:\projects c:\projects\com\example\web\B.java

可是還是出現錯誤如下:

C:\projects\com\example\web\B.java:16:package com.example.web.B does not exist

com.example.web.B.B be= new com.example.web.B.B();
^


reply to postreply to post
作者 Re:請問關於package敘述的怪問題? [Re:yalantw]
hkdennis2k





發文: 1926
積分: 6
於 2006-01-16 09:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
yalantw wrote:
C:\projects\com\example\web\B.java:16:package com.example.web.B does not exist

com.example.web.B.B be= new com.example.web.B.B();
^


reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8