1.5 java程序規(guī)范
1.5.1 java源程序結(jié)構(gòu)
一個(gè)完整的java源程序應(yīng)該包括下列部分:
package語(yǔ)句; //該部分至多只有一句,必須放在源程序的第一句
import語(yǔ)句; /*該部分可以有若干import語(yǔ)句或者沒(méi)有,必須放在所有的
類(lèi)定義之前*/
public classDefinition; //公共類(lèi)定義部分,至多只有一個(gè)公共類(lèi)的定義
//java語(yǔ)言規(guī)定該java源程序的文件名必須與該公共類(lèi)名完全一致
classDefinition; //類(lèi)定義部分,可以有0個(gè)或者多個(gè)類(lèi)定義
interfaceDefinition; //接口定義部分,可以有0個(gè)或者多個(gè)接口定義
例如一個(gè)java源程序可以是如下結(jié)構(gòu),該源程序命名為HelloWorldApp.java:
package javawork.helloworld; /*把編譯生成的所有.class文件放到包
javawork.helloworld中*/
import java.awt.*; //告訴編譯器本程序中用到系統(tǒng)的AWT包
import javawork.newcentury; /*告訴編譯器本程序中用到用戶(hù)自定義
的包javawork.newcentury*/
public class HelloWorldApp{......} /*公共類(lèi)HelloWorldApp的定義,
名字與文件名相同*/
class TheFirstClass{......} //第一個(gè)普通類(lèi)TheFirstClass的定義
class TheSecondClass{......} //第二個(gè)普通類(lèi)TheSecondClass的定義
...... //其它普通類(lèi)的定義
interface TheFirstInterface{......} /*第一個(gè)接口
TheFirstInterface的定義*/
...... //其它接口定義
package語(yǔ)句:由于java編譯器為每個(gè)類(lèi)生成一個(gè)字節(jié)碼文件,且文件名與類(lèi)名相同,因此同名的類(lèi)有可能發(fā)生沖突。為了解決這一問(wèn)題,java提供包來(lái)管理類(lèi)名空間,包實(shí)際提供了一種命名機(jī)制和可見(jiàn)性限制機(jī)制。而在java的系統(tǒng)類(lèi)庫(kù)中,把功能相似的類(lèi)放到一個(gè)包(package)中,例如所有的圖形界面的類(lèi)都放在java.awt這個(gè)包中,與網(wǎng)絡(luò)功能有關(guān)的類(lèi)都放到j(luò)ava.net這個(gè)包中。用戶(hù)自己編寫(xiě)的類(lèi)(指.class文件)也應(yīng)該按照功能放在由程序員自己命名的相應(yīng)的包中,例如上例中的javawork.helloworld就是一個(gè)包。包在實(shí)際的實(shí)現(xiàn)過(guò)程中是與文件系統(tǒng)相對(duì)應(yīng)的,例如javawork.helloworld所對(duì)應(yīng)的目錄是path\javawork\helloworld,而path是在編譯該源程序時(shí)指定的。比如在命令行中編譯上述HelloWorldApp.java文件時(shí),可以在命令行中敲入"javac -d f:\javaproject HelloWorldApp.java",則編譯生成的HelloWorldApp.class文件將放在目錄f:\javaproject\javawork\helloworld\目錄下面,此時(shí)f:\javaprojcet相當(dāng)于path。但是如果在編譯時(shí)不指定path,則生成的.class文件將放在編譯時(shí)命令行所在的當(dāng)前目錄下面。比如在命令行目錄f:\javaproject下敲入編譯命令"javac HelloWorldApp.java",則生成的HelloWorldApp.class文件將放在目錄f:\javaproject下面,此時(shí)的package語(yǔ)句相當(dāng)于沒(méi)起作用。 來(lái)源:www.examda.com
但是,如果程序中包含了package語(yǔ)句,則在運(yùn)行時(shí)就必須包含包名。例如,HelloWorldApp.java程序的第一行語(yǔ)句是:package p1.p2;編譯的時(shí)候在命令行下輸入"javac -d path HelloWorldApp.java",則HelloWorldApp.class將放在目錄path\p1\p2的下面,這時(shí)候運(yùn)行該程序時(shí)有兩種方式:
第一種:在命令行下的path目錄下輸入字符"java p1.p2.HelloWorldApp"。
第二種:在環(huán)境變量classpath中加入目錄path,則運(yùn)行時(shí)在任何目錄下輸入"java p1.p2.HelloWorldApp"即可。
import語(yǔ)句:如果在源程序中用到了除java.lang這個(gè)包以外的類(lèi),無(wú)論是系統(tǒng)的類(lèi)還是自己定義的包中的類(lèi),都必須用import語(yǔ)句標(biāo)識(shí),以通知編譯器在編譯時(shí)找到相應(yīng)的類(lèi)文件。例如上例中的java.awt是系統(tǒng)的包,而javawork.newcentury是用戶(hù)自定義的包。比如程序中用到了類(lèi)Button,而B(niǎo)utton是屬于包java.awt的,在編譯時(shí)編譯器將從目錄classpath\java\awt中去尋找類(lèi)Button,classpath是事先設(shè)定的環(huán)境變量,比如可以設(shè)為:classpath=.;d:\jdk1.3\lib\。 classpath也可以稱(chēng)為類(lèi)路徑,需要提醒大家注意的是,在classpath中往往包含多個(gè)路徑,用分號(hào)隔開(kāi)。例如classpath=.;d:\jdk1.3\lib\中的第一個(gè)分號(hào)之前的路徑是一個(gè)點(diǎn),表示當(dāng)前目錄,分號(hào)后面的路徑是d:\jdk1.3\lib\,表示系統(tǒng)的標(biāo)準(zhǔn)類(lèi)庫(kù)目錄。在編譯過(guò)程中尋找類(lèi)時(shí),先從環(huán)境變量classpath的第一個(gè)目錄開(kāi)始往下找,比如先從當(dāng)前目錄往下找java.awt中的類(lèi)Button時(shí),編譯器找不著,然后從環(huán)境變量classpath的第二個(gè)目錄開(kāi)始往下找,就是從系統(tǒng)的標(biāo)準(zhǔn)類(lèi)庫(kù)目錄d:\jdk1.3\lib開(kāi)始往下找java.awt的Button這個(gè)類(lèi),最后就找到了。如果要從一個(gè)包中引入多個(gè)類(lèi)則在包名后加上".*"表示。
1.5.1 java源程序結(jié)構(gòu)
一個(gè)完整的java源程序應(yīng)該包括下列部分:
package語(yǔ)句; //該部分至多只有一句,必須放在源程序的第一句
import語(yǔ)句; /*該部分可以有若干import語(yǔ)句或者沒(méi)有,必須放在所有的
類(lèi)定義之前*/
public classDefinition; //公共類(lèi)定義部分,至多只有一個(gè)公共類(lèi)的定義
//java語(yǔ)言規(guī)定該java源程序的文件名必須與該公共類(lèi)名完全一致
classDefinition; //類(lèi)定義部分,可以有0個(gè)或者多個(gè)類(lèi)定義
interfaceDefinition; //接口定義部分,可以有0個(gè)或者多個(gè)接口定義
例如一個(gè)java源程序可以是如下結(jié)構(gòu),該源程序命名為HelloWorldApp.java:
package javawork.helloworld; /*把編譯生成的所有.class文件放到包
javawork.helloworld中*/
import java.awt.*; //告訴編譯器本程序中用到系統(tǒng)的AWT包
import javawork.newcentury; /*告訴編譯器本程序中用到用戶(hù)自定義
的包javawork.newcentury*/
public class HelloWorldApp{......} /*公共類(lèi)HelloWorldApp的定義,
名字與文件名相同*/
class TheFirstClass{......} //第一個(gè)普通類(lèi)TheFirstClass的定義
class TheSecondClass{......} //第二個(gè)普通類(lèi)TheSecondClass的定義
...... //其它普通類(lèi)的定義
interface TheFirstInterface{......} /*第一個(gè)接口
TheFirstInterface的定義*/
...... //其它接口定義
package語(yǔ)句:由于java編譯器為每個(gè)類(lèi)生成一個(gè)字節(jié)碼文件,且文件名與類(lèi)名相同,因此同名的類(lèi)有可能發(fā)生沖突。為了解決這一問(wèn)題,java提供包來(lái)管理類(lèi)名空間,包實(shí)際提供了一種命名機(jī)制和可見(jiàn)性限制機(jī)制。而在java的系統(tǒng)類(lèi)庫(kù)中,把功能相似的類(lèi)放到一個(gè)包(package)中,例如所有的圖形界面的類(lèi)都放在java.awt這個(gè)包中,與網(wǎng)絡(luò)功能有關(guān)的類(lèi)都放到j(luò)ava.net這個(gè)包中。用戶(hù)自己編寫(xiě)的類(lèi)(指.class文件)也應(yīng)該按照功能放在由程序員自己命名的相應(yīng)的包中,例如上例中的javawork.helloworld就是一個(gè)包。包在實(shí)際的實(shí)現(xiàn)過(guò)程中是與文件系統(tǒng)相對(duì)應(yīng)的,例如javawork.helloworld所對(duì)應(yīng)的目錄是path\javawork\helloworld,而path是在編譯該源程序時(shí)指定的。比如在命令行中編譯上述HelloWorldApp.java文件時(shí),可以在命令行中敲入"javac -d f:\javaproject HelloWorldApp.java",則編譯生成的HelloWorldApp.class文件將放在目錄f:\javaproject\javawork\helloworld\目錄下面,此時(shí)f:\javaprojcet相當(dāng)于path。但是如果在編譯時(shí)不指定path,則生成的.class文件將放在編譯時(shí)命令行所在的當(dāng)前目錄下面。比如在命令行目錄f:\javaproject下敲入編譯命令"javac HelloWorldApp.java",則生成的HelloWorldApp.class文件將放在目錄f:\javaproject下面,此時(shí)的package語(yǔ)句相當(dāng)于沒(méi)起作用。 來(lái)源:www.examda.com
但是,如果程序中包含了package語(yǔ)句,則在運(yùn)行時(shí)就必須包含包名。例如,HelloWorldApp.java程序的第一行語(yǔ)句是:package p1.p2;編譯的時(shí)候在命令行下輸入"javac -d path HelloWorldApp.java",則HelloWorldApp.class將放在目錄path\p1\p2的下面,這時(shí)候運(yùn)行該程序時(shí)有兩種方式:
第一種:在命令行下的path目錄下輸入字符"java p1.p2.HelloWorldApp"。
第二種:在環(huán)境變量classpath中加入目錄path,則運(yùn)行時(shí)在任何目錄下輸入"java p1.p2.HelloWorldApp"即可。
import語(yǔ)句:如果在源程序中用到了除java.lang這個(gè)包以外的類(lèi),無(wú)論是系統(tǒng)的類(lèi)還是自己定義的包中的類(lèi),都必須用import語(yǔ)句標(biāo)識(shí),以通知編譯器在編譯時(shí)找到相應(yīng)的類(lèi)文件。例如上例中的java.awt是系統(tǒng)的包,而javawork.newcentury是用戶(hù)自定義的包。比如程序中用到了類(lèi)Button,而B(niǎo)utton是屬于包java.awt的,在編譯時(shí)編譯器將從目錄classpath\java\awt中去尋找類(lèi)Button,classpath是事先設(shè)定的環(huán)境變量,比如可以設(shè)為:classpath=.;d:\jdk1.3\lib\。 classpath也可以稱(chēng)為類(lèi)路徑,需要提醒大家注意的是,在classpath中往往包含多個(gè)路徑,用分號(hào)隔開(kāi)。例如classpath=.;d:\jdk1.3\lib\中的第一個(gè)分號(hào)之前的路徑是一個(gè)點(diǎn),表示當(dāng)前目錄,分號(hào)后面的路徑是d:\jdk1.3\lib\,表示系統(tǒng)的標(biāo)準(zhǔn)類(lèi)庫(kù)目錄。在編譯過(guò)程中尋找類(lèi)時(shí),先從環(huán)境變量classpath的第一個(gè)目錄開(kāi)始往下找,比如先從當(dāng)前目錄往下找java.awt中的類(lèi)Button時(shí),編譯器找不著,然后從環(huán)境變量classpath的第二個(gè)目錄開(kāi)始往下找,就是從系統(tǒng)的標(biāo)準(zhǔn)類(lèi)庫(kù)目錄d:\jdk1.3\lib開(kāi)始往下找java.awt的Button這個(gè)類(lèi),最后就找到了。如果要從一個(gè)包中引入多個(gè)類(lèi)則在包名后加上".*"表示。