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

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 關於 main() 和 .java檔名的設計 [精華]
jeans

危險!高壓電勿近。



發文: 30
積分: 1
於 2004-02-29 10:27 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
1. 請問 main 為何一定要是 public static void?
2. 請問為什麼 class 名一定要和檔名相同?

我已經用孤狗大神找過了。


anthonycs edited on 2004-02-29 18:46
reply to postreply to post
滿招損 謙受益
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
pcbill





發文: 75
積分: 1
於 2004-02-29 11:09 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
我的猜測.....
1. main() 通常是程式的進入點,若不設成 public 就不具意義。再來,對於整個程式進入點只需要一個,所以設 static 。最後,你要程式進入點回傳什麼值? 不需要,於是不回傳任何值。

2. name space 的關係吧。

以上沒有寫程式查証或查相關資料,有錯請指正,謝謝。


anthonycs edited on 2004-04-10 23:11
reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:pcbill]
tawei0428





發文: 25
積分: 1
於 2004-02-29 11:58 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
我想
1.一個原始檔最多只能有1個public class。
2.若有public class,檔名一定要和此public class相同;若沒有public class,檔名無所謂。
3.只有在程式進入點的那一個main需要public static void,否則會發生runtime exception。(會找不到程式的進入點。)在其他的地方也取名叫 main,他就不需要public static void。
不曉得至樣對不對,若觀念有錯的話,希望大家告知。
另外,為何一個原始檔只能有一個public class?為何有public class,檔名一定要和此public class相同?我只知其然而不知其所以然,若有高手能指點一下,真是感激啦。


browser edited on 2004-02-29 20:05
reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:tawei0428]
jeans

危險!高壓電勿近。



發文: 30
積分: 1
於 2004-02-29 12:43 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
多謝各位高手的指點,抱歉,我沒講清楚我要問的,我要問的是為什麼進入點的那個 main 一定要是 public static void,public 和 static 大概可以猜出來,但為什麼是 void?
而 class 名為什麼要和檔名相同我也沒講清楚,當然一個檔案不會只有一個 class,先排除這個假設。

我舉個實例好了:

1
2
3
4
5
6
public class Test {
 
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
}


1. 為什麼這裡面的 main 是 void, 為什麼不能用 int? 是為了表示 java 與 OS 無關嗎?
2. 為什麼這個程式檔名一定是 Test.java, 我高興用 a.java 為什麼不行? 還是有效率上的考量.
3. Hello world 真神奇! Big Smile


browser edited on 2004-02-29 20:05
reply to postreply to post
滿招損 謙受益
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
獨孤牧





發文: 6
積分: 0
於 2004-02-29 13: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
1
2
3
4
5
6
public class Test {
  public static int main(String[] args) {
    System.out.println("Hello world!");
    return 0;
  }
}


將殘生 NoSuchMethodError

public class NoSuchMethodError
extends IncompatibleClassChangeError

Thrown if an application tries to call a specified method of a
class (either static or instance), and that class no longer has
a definition of that method.

Normally, this error is caught by the compiler; this error can
only occur at run time if the definition of a class has incompatibly
changed.


browser edited on 2004-02-29 20:05
reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
moliwang

用嘴巴打嘴炮比用鍵盤打嘴炮要來的務實

版主

發文: 1215
積分: 6
於 2004-02-29 13:38 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
jeans wrote:
1. 請問 main 為何一定要是 public static void?


因為在系統一開始的時候,並沒有任何class載入進來,
如果不設定成static, 假設您的類別叫做Start,
JVM就要產生並執行類似
Start s = new Start() ;
s.main(args);
這樣的程式碼,如果Start類別還有很多不同的constructor,
那啟動時需要作的判斷就更多(有的人可能沒有default constructor),
但是一旦設計成static, JVM只要直接執行
Start.main(args[]) ;
就可以了.
至於public是因為,Start類別其實是由Class Loader載入並執行的,
Class Loader也是一個Java類別,如果宣告成private / protected,
Class Loader就會受到存取權的限制.
最後是void, Java已經採用exception機制,那種古老傳回狀態的
設計方法就可以"安息"了.


2. 請問為什麼 class 名一定要和檔名相同?


這是要簡化compiler的設計.詳細情形請先了解package/import機制,
這裡我簡單說明一下,
假設您的程式如下

import com.my.* ;
....
Test t = new Test() ;

編譯器看到這樣的code,如果最後名稱解析後,判斷出Test的全名應該是
com.my.Test
那麼接著就要找出Test這個類別的定義,問題來了,那Test這個類別的定義到底
在哪裡呢?
如果採用C/C++ include的方法,會有向前/向後 參考的問題,必須把目前編譯器所知的所有.h/.c/.cpp的定義都存成某種資料庫結構,作為以後參考用,因此,如果class的定義無法找到,就會照成無法編譯.
可是Java為何可以避免向前/向後參考的問題呢? 就是因為當編譯器確定
全名為com.my.Test之後,就會自動去找
<classpath>/com/my/Test.class (或是找不到.class時,就先編譯.java)
來進行語意確認,這樣子編譯器就可以省下大量的工作,也可以減少記憶體的使用. 為了配合這個機制,我們就必須有配套的措施,讓compiler要找這些類別的定義時真的能夠找到,所以有package/import機制的產生,為了確定Test.java編譯之後真的能夠產生Test.class,所以就限定Test.java之中,會有一個跟檔案同名的class定義.

舉個例子.
A.java裡頭用到class B的定義,假設class B的定義放在C.java之中:
那麼編譯A.java的時候,編譯器就會去找B.java來編譯,可以編譯器找不到,就會發生編譯錯誤.因為編譯器根本不知道class B定義在C.java之中.
因此我們會把C.java改成B.java
重新編譯之後,編譯器就會先compile B.java,並希望能夠產生B.class,
可是萬一寫程式的人打錯字,把 B打成b呢? B.java的編譯會產生b.class
可是編譯器需要的是 B.class,這樣又會造成編譯錯誤. 這個時候,
一般大家最討厭的"檔案和類別同名"的設計就派上用場了,如果檔案和public類別一定要同名,代表class B一定定義在B.java,所以B.java一定至少會產生B.class
,這樣編譯器就可以進行後續動作.

打好多字...好累 >"<


browser edited on 2004-02-29 20:05
reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
jeans

危險!高壓電勿近。



發文: 30
積分: 1
於 2004-02-29 14:06 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 的差異性來說明,實在是講得太好了,我完全明白了!
甘溫啊! Smile


browser edited on 2004-02-29 20:06
reply to postreply to post
滿招損 謙受益
作者 Re:關於 main() 和 .java檔名的設計 [Re:moliwang]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2004-02-29 16:20 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
moliwang wrote:
這是要簡化compiler的設計.詳細情形請先了解package/import機制,
這裡我簡單說明一下,
假設您的程式如下
(恕刪)


其實public class name -> java file
1 public class 1 java file的限制
讓IDE做trace code的設計簡單很多

試想
如果我們想要看一個某個class的source code..
若有這樣的限制
那我們可以很快的找到該class所在的file在哪裡
並不需要花額外的空間來紀錄這些資訊


browser edited on 2004-02-29 20:06
reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:popcorny]
moliwang

用嘴巴打嘴炮比用鍵盤打嘴炮要來的務實

版主

發文: 1215
積分: 6
於 2004-02-29 18:23 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
popcorny wrote:
其實public class name -> java file
1 public class 1 java file的限制
讓IDE做trace code的設計簡單很多

試想
如果我們想要看一個某個class的source code..
若有這樣的限制
那我們可以很快的找到該class所在的file在哪裡
並不需要花額外的空間來紀錄這些資訊


像是.net裡頭metadata的設計,也是簡化工具設計開發的方法.
記得在Programming Microsoft.NET這本書裡頭,作者
Jeff Prosise 提到他寫程式寫了那麼久,充分體會到寫程式
最後都是在處理資料,如果資料的結構設計的好一點,
程式就可以寫的比較漂亮 Smile


browser edited on 2004-02-29 20:06
reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-03-01 00:40 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
jeans wrote:
多謝各位高手的指點,抱歉,我沒講清楚我要問的,我要問的是為什麼進入點的那個 main 一定要是 public static void,public 和 static 大概可以猜出來,但為什麼是 void?
而 class 名為什麼要和檔名相同我也沒講清楚,當然一個檔案不會只有一個 class,先排除這個假設。

我舉個實例好了:

1
2
3
4
5
6
public class Test {
 
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
}


1. 為什麼這裡面的 main 是 void, 為什麼不能用 int? 是為了表示 java 與 OS 無關嗎?
2. 為什麼這個程式檔名一定是 Test.java, 我高興用 a.java 為什麼不行? 還是有效率上的考量.
3. Hello world 真神奇! Big Smile


關於第一點∼∼
我很懷疑的是∼∼你宣告成 int ,這 int 要給傳給誰用啊?
如果不限制要宣告成 void,讓使用者自己隨便宣告成 int String char boolen Onject.......有啥好處嗎?


reply to postreply to post
請養成良好的 Java 程式碼慣例 習慣
作者 Re:關於 main() 和 .java檔名的設計 [Re:TAHO]
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-03-01 00: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
TAHO wrote:
關於第一點∼∼
我很懷疑的是∼∼你宣告成 int ,這 int 要給傳給誰用啊?
如果不限制要宣告成 void,讓使用者自己隨便宣告成 int String char boolen Onject.......有啥好處嗎?


我想他可能有學過C或是之類的吧


reply to postreply to post
YOSHI!
作者 Re:關於 main() 和 .java檔名的設計 [Re:TAHO]
jeans

危險!高壓電勿近。



發文: 30
積分: 1
於 2004-03-01 01:01 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
TAHO wrote:
關於第一點∼∼
我很懷疑的是∼∼你宣告成 int ,這 int 要給傳給誰用啊?
如果不限制要宣告成 void,讓使用者自己隨便宣告成 int String char boolen Onject.......有啥好處嗎?


會這麼做的原因是要回傳數傳值給 OS,單純只用 java 的眼光來看,當然會覺得這個問題奇怪,至於 java 不可的原因王森大大有說明了。


reply to postreply to post
滿招損 謙受益
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
demijava2

Fight-F-U



發文: 74
積分: 1
於 2005-07-26 11:52 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:關於 main() 和 .java檔名的設計 [Re:jeans]
twelve





發文: 14
積分: 0
於 2006-03-09 13: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
晓得了,谢谢

reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
honghong





發文: 4
積分: 0
於 2006-06-21 11:17 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
原來如此~j
ava有如此令人討厭的設計原來是大有來頭地!!
真是受益良多啊
感恩


reply to postreply to post
作者 Re:關於 main() 和 .java檔名的設計 [Re:jeans]
CC3001





發文: 4
積分: 0
於 2006-07-11 00:12 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:關於 main() 和 .java檔名的設計 [Re:jeans]
zhhaojie





發文: 9
積分: 0
於 2010-09-03 20:36 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
» 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