本文關鍵字:java源文件,package語句,import語句
Java語言的源程序代碼由一個或多個編譯單元(Compilation unit)組成,每個編譯單元只能包含下列內容(空格和注釋除外),如表2-1所示。
表2-1 Java源文件結構
結構 |
作用 |
要求 |
package語句 |
聲明類所在的包 |
0或1個,必須放在文件開始 |
import語句 |
從特定的包引入類 |
0或多個,必須放在所有類定義之前 |
public classDefinition |
公共類定義部分 |
0或1個 |
classDefinition |
非公共類定義部分 |
0或多個 |
interfaceDefinition |
接口定義部分 |
0或多個 |
package語句
在大型項目開發(fā)中,為了避免類名的重復,經常使用“包”來組織各個類。例如,公司用開發(fā)了一個類Food,公司乙也開發(fā)了一個類Food,現在需要同時用到這兩個類,為了將這兩個類區(qū)分開來,將這兩個文件放在兩個不同的目錄下。那么,在使用的時候如何準確地找到需要的類呢?這就需要用到“包(package)”這個概念。
在Java程序中可以用package來指明這兩個類的引用路徑:將甲公司開發(fā)的Student類放到一個包(package)中,而將乙公司開發(fā)的Student類放到另一個包(package)中。為了避免不同的公司之間類名的重復,Sun建議使用公司Internet域名的倒寫來當做包名,例如,使用域名farsight.com.cn的倒寫 cn.com.farsight來作為包的名稱。如果現在有一個名為Student的類,將它放到目錄cn\com\farsight下,然后再在程序中加入如下語句:
package cn.com.farsight;
這樣,這個類就可以和其他的名稱為Student的類區(qū)分開了。
package語句的基本語法如下:
package <top_pkg_name> [ .<sub_pkg_name>] * ;
在同一個項目組中,經常用功能或模塊的名稱來作為子包名,例如,現在開發(fā)一個學員管理系統,一個用于華清遠見的管理模塊,一個用于清華附中的管理模塊,這兩個功能模塊中均有一個Student的類,這時可以將華清遠見管理模塊中使用的Student放到cn\com\farsight\college目錄下,而將清華附中管理模塊的Student類放到cn\com\farsight\school中,這樣,這兩個文件就不會沖突了。
注意,當將開發(fā)的類放到包中時,必須將類的源文件放到與包名的元素相一致的目錄結構中,就如上面的學生類Student,如果在文件中加入了package語句:package cn.com.farsight,則必須將這個Student類文件放到cn\com\farsight目錄下。在磁盤目錄結構中,使用“\”(Windows)或“/”(Unix/Linux/BSD)來分隔各個層級的目錄,而在Java類文件中,使用“.”來分隔包的層次。
Java的核心包都放在Java包及其子包中,而將很多擴展包放在javax包及其子包中。在Java核心包中,也有一些重復的類名,就是通過不同的包來區(qū)分的,例如,在java.sql包中,有一個Date類,而在java.util中,也有一個Date類。通過將它們放在不同的包中,就可以區(qū)分這兩個類。
一般來說,如果在程序中使用package將程序打包,則將程序放到對應的目錄下,這樣,才不違背package的設計初衷。如果將類的源文件(.java文件)都放到同一個路徑下,只是將編譯后的class文件放到不同的目錄下,上面提到的文件名沖突的問題依然存在(同一個路徑下不允許兩個文件同名),因此,需要將源文件保存在不同的路徑中。這時,可以使用如下命令來編譯文件:
javac cn\com\farsight\college\Student.java
在cn目錄的上一級目錄下執(zhí)行上述命令。
如果程序是一個帶main方法的應用程序,可以在cn目錄的上一級目錄下執(zhí)行這個文件,命令如下:
java cn.com.farsight.college.Student
注意編譯和執(zhí)行時的分隔符。因為在編譯時,需要指明的是文件的路徑,所以使用“\”來分隔;而在執(zhí)行類文件時,需要指明的是包名稱,所以使用“.”來分隔。
下面來看一個使用package的例子。
源文件:Student.java
package cn.com.farsight;
public class Student {
// 定義屬性
private String studentId;
// 定義屬性“studentId”的設置方法
public void setStudentId(String student_Id) {
studentId = student_Id;
}
// 定義屬性“studentId”的獲取方法
public String getStudentId() {
return studentId;
}
}
這個程序好放在路徑cn\com\farsight下,然后再在cn的上一層路徑執(zhí)行如下的指令編譯程序:
javac cn\com\farsight\Student.java
而被編譯后的class文件必須放置在cn\com\farsight路徑下,這樣才可以成功地被其他程序引用。
如果Student是一個應用程序(有一個main()方法),那么,為了執(zhí)行這個程序,必須在“cn”的上一級目錄執(zhí)行如下的指令:
java cn.com.farsight.Student
import語句
在編譯器定位你所創(chuàng)建的類所訪問的其他類的過程中,包(package)扮演了重要的角色。當編譯器碰到一個類對另一個類的引用時,它會在當前的包中和設置的CLASSPATH中尋找這個類,以檢查這個類是否能在這些路徑中找到。
import語句應該出現在package語句之后(如果有的話),類的定義之前。package語句只能有一個,但是import語句可以有多個。
可以使用import來引入包中的一個類,也可以用import來引入指定包中的所有類。
import語句的基本語法如下:
import <pkg_name>[.<sub_pkg_name>].<class_name>;
或
import <pkg_name>[.<sub_pkg_name>].*;
● 引入一個類:
import cn.com.farsight.college.Student
● 引入指定包中的所有類使用通配符“*”:
import cn.com.farsight.college.*
這樣就可以引入包cn.com.farsight.college中的所有類。
這兩種方式對于引入相應的類并沒有什么區(qū)別。但是,如果只是需要一個包中有限的幾個類,建議采用第一種方式(寫明引入的類名)會讓人一目了然。另外,需要注意的是,通過import引入包中的類的時候,它并不會遞歸地執(zhí)行引入動作,比如,通過下面的語句:
import cn.com.farsight.*;
引入了cn.com.farsight這個包中的所有類,但它并不會引入cn.com.farsight.school和cn.com.farsight.colleage中的類。要使用這兩個包中的類,還需要將它們使用“import”語句分別引入。
Java編譯器默認為所有的Java程序引入了JDK的java.lang包中所有的類(import java.lang.*;),其中定義了一些常用類:System、String、Object、Math等。因此可以直接使用這些類而不必顯式引入。但使用其他非無名包中的類則必須先引入、后使用。
另外,可以通過在類名前加上不同的限制符,如public等來控制類的適用范圍。關于這些限制符及相應的使用范圍,將在后續(xù)章節(jié)介紹。
package語句和import語句實例
1.任務描述
編寫一個Parent類,在構造方法中輸出“我是parent”,放在parent包中,編寫一個Child類,在構造方法中輸出“我是child”放在child包中,child包是parent包的子包。使用package語句生成包,并使用import引用子包。
2.技能要點
● 掌握包的創(chuàng)建和使用。
● 通過給包命名創(chuàng)建包的層次。
3.任務實現過程
(1)在scr默認包中創(chuàng)建parent包,在此包中創(chuàng)建Parent類,不帶參數,在構造方法中輸出“I am a parent”。
(2)創(chuàng)建parent的子包parent.child包,在此包中創(chuàng)建Child類,不帶參數,在構造方法中輸出“I am a child ”。
(3)在Parent類中使用import語句引入parent.child包,并創(chuàng)建Parent類和Child類對象,實現輸出。
Parent.java
package parent;
import parent.child.Child;
public class Parent {
public Parent(){
System.out.print("I am a parent");
}
public static void main(String[] args) {
Child c = new Child();
Parent p = new Parent();
}
}
Child.java
package parent.child;
public class Child {
public Child(){
System.out.print("I am a child \n");
}
}
運行結果:
I am a child
I am a parent
本文選自華清遠見android開發(fā)培訓教材《Android系統下Java編程詳解》