- Java程序員面試秘笈
- 陳浩編著
- 246字
- 2019-01-02 07:03:47
第1章 Java編程基礎
通過考察Java編程基礎,用人單位可以了解求職者對Java語言的理解程度和熟練程度,一個熟練、具備開發經驗的程序員,可以輕松地解答相關問題。而對于剛剛準備步入職場的新人,由于基礎不扎實,準備不充分,Java基礎編程方面的面試題往往會給他們造成一定的困擾。值得注意的是,企業和學校對Java基礎考察的方向有很大的不同,往往求職者對哪些編程基礎必須掌握沒有一個清醒的認識,不知道企業需要考察哪方面的知識,這樣會失去很多可貴的機會。
本章通過真實的試題,從多個角度講解Java編程基礎部分的考點,使求職者能夠快速領會用人單位的需求,提高自己在應聘中成功的幾率。
求職者需要熟練掌握以下知識點。
? Java的安裝與調試,重點是Java環境的配置。
? Java開發中基本術語和基本概念。
? 理解類、對象、引用、變量、方法和成員。
? 熟練掌握Java的調試和運行。
? 了解和掌握常用的Java開發工具。
面試題1 簡單描述Java開發包的種類
考點:考察求職者對于Java體系的認識,屬于Java程序員的必備知識。
出現頻率:★★★
【面試題解析】隨著Java語言的成長和壯大,Java的開發包根據用途的不同已經分為Java EE、Java SE和Java ME 3個開發包,求職者需要列出名稱,并具體描述每個開發包的用途。
參考答案:
Java SDK的版本分類如下所述。
? Java ME:(Java Platform Micro Edition)一種以廣泛的消費性產品為目的的高度優化的Java運行環境,包括尋呼機、移動電話、可視電話、數字機頂盒等。它是致力于消費產品和嵌入式設備的開發人員的最佳選擇。
? Java SE:(Java Platform Standard Edition)是針對桌面開發以及低端商務計算解決方案而開發的版本。
? Java EE:(Java Platform Enterprise Edition)是一種利用Java平臺來簡化企業解決方案的開發、部署和管理相關的復雜問題的體系結構。J2EE的基礎是JAVA SE,J2EE不僅鞏固了標準版中的許多優點,同時還提供了對EJB、Servlets、JSP以及XML技術的全面支持。面向對象設計思想是Java程序設計基礎,作為一個合格的Java程序員,必須對面向對象編程(OOP)有深刻的理解。所以常見的面試題中都會出現考察求職者對OOP理解方面的題目。
面試題2 Java語言的特性有哪些
考點:考察求職者對Java語言的認識。
出現頻率:★★
【面試題解析】需要求職者列出Java語言的幾個重要特點。答題時只需要寫出特點,一般不需要詳細解釋。下面參考答案中給出了相應的詳細描述,供讀者參考,同時加強理解。
參考答案:
Java語言是一個面向對象的程序設計語言。Java語言吸收了Smalltalk語言和C++語言的優點,并增加了其他特性,如支持并發程序設計、網絡通信和多媒體數據控制等。主要特性如下。
(1)Java語言是簡單的。一方面,Java語言的語法與C語言和C++語言很接近,大多數程序員很容易學習和使用Java。另一方面,Java丟棄了C++中使用頻率相對較少的、較難理解的一些特性,如操作符重載、多繼承、自動的強制類型轉換。特別地,Java語言不使用指針,并提供了自動的廢料收集,使得程序員不必為內存管理而擔憂。
(2)Java語言是面向對象的。Java語言提供類、接口和繼承等特性,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實現機制(關鍵字為implements)。Java語言全面支持動態綁定,而C++語言只對虛函數使用動態綁定。總之,Java語言是一個單純的面向對象的程序設計語言。
(3)Java語言是分布式的。Java語言支持Internet應用的開發,在基本的Java應用編程接口中有一個網絡應用編程接口(java.net),它提供了用于網絡應用編程的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠程方法激活)機制也是開發分布式應用的重要手段。
(4)Java語言是健壯的。強類型機制、異常處理機制、垃圾回收機制、安全檢查機制等是Java程序健壯性的重要保證。對指針的丟棄是Java的明智選擇。
(5)Java語言是安全的。Java通常被用在網絡環境中,以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網絡下載的類本身具有一個安全防范機制,通過分配不同的名字空間,以防替代本地的同名類和字節代碼檢查,并提供安全管理機制(類SecurityManager)讓Java應用設置安全哨兵。
(6)Java語言是跨平臺的。Java程序在Java平臺上被編譯為體系結構中立的字節碼格式(后綴為class的文件),可以在任何操作系統中的Java虛擬機上運行。
(7)Java語言是多線程的。Java語言支持多個線程的同時執行,并提供多線程之間的同步機制(關鍵字為synchronized)。
面試題3 Linux操作系統下如何安裝Java SE開發環境
考點:由于大部分的計算機用戶都使用Windows作為操作系統,而Java語言是具有跨平臺優勢的,不同企業有不同的開發環境,本試題考察求職者是否有在Linux下開發Java的經驗。Linux環境下的Java安裝是一個基礎問題。
出現頻率:★★★
【面試題解析】該問題有兩個關鍵點,一個是Linux版本Java SDK的文件類型,另外一個是Linux環境變量的配置。
參考答案:
Oracle發布的Linux操作系統Java包有JDK和JRE兩種版本。JDK(Java Development Kit,Java開發包)是整個Java的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具和Java基礎的類庫(rt.jar)。
JRE(Java Runtime Envirnment,Java運行環境)是JDK的一個部分,僅僅提供了運行Java程序的環境,如果開發Java程序,必須安裝JDK。
(1)首先到Sun的網站上去下載JDK,截止本書編寫時最新版本為Java 7 update 21,下載jdk-7u21-linux-i586.tar.gz文件。
(2)把安裝文件解壓出來。假設下載的文件保存在/opt下。打開終端,運行以下命令:
cd /opt tar zxvf jre-7u21-linux-i586.tar.gz
Java文件將安裝在/opt目錄中的jdk1.7.0_21內。
(3)測試是否安裝成功,可以在控制臺中輸入如下命令:
java -version
如果安裝成功,控制臺會顯示當前JDK的版本信息。
(4)配置JAVA_HOME環境變量:一般Java開發者需要在操作系統的環境變量中配置JAVA_HOME,這樣才能使其他Java項目,例如Struts、Tomcat等能夠正常運行。這里以最常用的bash命令解釋器為例,編輯用戶目錄下的.bashrc或.profile文件。如果需要在所有用戶的shell下都生效,就編輯/etc/profile文件。同樣都是加入以下內容:
export JAVA_HOME=/opt/ jdk1.7.0_21 export JRE_HOME=/opt/jdk1.7.0_21 /jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:.
注意:在Windows操作系統中安裝JDK更加簡單,只需要配置好 JAVA__HOME 和CLASSPATH這2個環境變量即可。Linux配置中,多個路徑直接使用“:”連接,而Windows操作系統中則使用“,”來連接。為了方便Java程序的編譯,特別是使用javac來進行編譯的情況下,需要在CLASSPATH中加入“.”,即當前路徑。
面試題4 列出你熟悉的Java開發工具
考點:該問題一般會在面試時出現,主要是看求職者是否熟悉常用的Java開發工具,因為一個項目開發團隊會使用一種固定的開發工具,只有求職者能夠熟練使用該工具,才能夠快速融入該團隊。
出現頻率:★★★★★
【面試題解析】Java作為一種跨平臺開發語言,由于其開源性,各個公司和社區組織,都推出了各自的Java開發工具,這也是Java開發體系同微軟的開發體系的區別之一。不同的項目開發團隊一般都有自己熟悉的開發工具或者開發環境,求職者只有熟練使用不同的開發工具,才能適應項目開發需要,得到用人單位的認同,增加成功的把握。從國內的情況來看,大多數都是使用JBuilder和Eclipse作為項目開發的首選工具,所以,求職者應該至少掌握其一。
參考答案:
常見的Java開發工具如下所述。
(1)JDK(Java Development Kit)Java開發工具:最基本的開發工具,必須掌握。
(2)Borland的JBuilder:JBuilder是歷史比較悠久的Java集成開發環境,也是要求求職者需要掌握的。不過目前很多開發團隊并不使用JBuilder作為開發工具,因為它是一個商業性的產品,需要付費。
(3)Oracle的JDeveloper:最新版本為11g,是Oracle公司提供的開發工具,它為構建具有J2EE功能的、多層的Java應用程序提供了一個完全集成的開發環境。目前國內使用率比較低,對于初學者來說,較復雜,也比較難。
(4)IBM的Visual Age for Java:Visual Age for Java是一個非常成熟的開發工具,它的特性對于IT開發者和業余的Java編程人員來說都是非常有用的。但是在國內,它也不是Java應用開發的主流工具。
(5)Eclipse:Eclipse是一種可擴展的開放源代碼的集成開發環境。Eclipse發展最快,得到了國內外大多數程序員的肯定,目前已經成為主流的Java開發工具。Eclipse的最大特點是能接受由Java開發者自己編寫的開放源代碼插件,同時Eclipse為工具開發商提供了更好的靈活性,使他們能更好地控制自己的軟件技術。
Eclipse可以說是求職者必須掌握的一個Java開發工具,缺點就是較復雜,對初學者來說,使用起來比較困難。
注意:此面試題的目的是了解求職者對于Java開發工具的認識和掌握。回答此類問題時,不必列出所有的開發工具。實際上,Java開發工具是非常多的,除了這里列出的之外,還有Microsoft VJ++、JCreator、Intellij IDEA和BEA的WebLogic Workshop等。求職者一般只要熟練使用JBuilder和Eclipse就可以滿足大部分的國內開發要求。值得注意的是,有些特別的公司,例如IBM會要求求職者熟悉IBM的Visual Age for Java,這就要求求職者在面試之前一定要先了解該公司的大致情況,做好相關的準備。
面試題5 用自己的語言描述Java中的類和對象
下列關于對象的哪一種說法是正確的?請選擇一個正確的答案。
(a)對象是可以對其進行實例化從而得到類的東西。
(b)對象是類的實例。
(c)對象是一種藍本,據此可以創建抽象的具體實現。
(d)對象是指向屬性的引用。
(e)對象是一種變量。
考點:該面試題考察求職者對于Java類和對象的理解。
出現頻率:★★★
【面試題解析】
1.類
在處理復雜事物的時候,用到的一種基本手段就是抽象。抽象的目的就是區別事物之間的本質和不同,面向對象編程(OOP)的實質就是利用類和對象來建立抽象模型。
類表示了對象的類別,是創建對象的藍本。建立一個事物的抽象模型,本質上就是表達該事物的性質和行為。使用類來建立抽象模型,是通過在類中定義變量和方法來實現的。
類中定義的屬性是一種可存儲值的變量,該變量代表著事物的具體性質。類的對象所具有的行是由定義的方法來實現的。類中定義的變量和方法被稱為類的成員。
在項目開發中,類一般可以通過UML建模來表示,如圖1.1所示。

圖1.1 類的UML表示法
圖1.1中,定義了類Gun的成員,即類Gun的變量和方法。從UML圖中可以看到,類定義了如下所示3個變量。
? caliber:是一個Double類型的變量,表示Gun類所抽象事物(槍)的口徑。
? length:是一個Double類型的變量,表示Gun類所抽象事物(槍)的長度。
? gun_type:是一個字符串類型的變量,表示Gun類所抽象事物(槍)的類型,例如是手槍還是突擊步槍。
同時類中定義了如下所示3個方法。
? fire:定義了Gun的開火行為,及fire方法。
? maintenance:定義了Gun的維護方法。
? Gun:定義了一個同類同名的構造方法。
開發者可以通過UML生成代碼工具,或者是手工在編輯器中建立圖1.1中所示的類,如下所示:
public class Gun { // 定義槍的口徑 public Double caliber; // 定義槍的長度 public Double length; // 定義槍的類型 public int gun_type; // 構造方法 public Gun() { } // 帶參數的構造方法 public Gun(String name) { } // 開火的方法 public void fire() { System.out.println(gun_type +" is fireing"); } // 維護的方法 public Boolean maintenance() { return true; } }
2.對象
對象是類的實例。對象在構造時以類為藍本,創建對象的過程叫做實例化。對象是類所表示的抽象事物的具體實例。例如前面所講述的Gun類,那么可以根據Gun類創建一個ak47的對象,即Gun的具體實現。
對象可以使用UML來表示,如圖1.2所示。

圖1.2 對象的UML表示法
ak47是根據Gun類創建的一個對象,在Java程序中,可以使用如下代碼創建一個Gun對象:
…… public static void main(String[] args) { //建立一個Gun類對象,即Gun類的實例ak47 Gun ak47=new Gun(); //定義ak47的口徑 ak47.caliber=7.6; //定義ak47的長度 ak47.length=57.8; //定義ak47的類型 ak47.gun_type="AK47"; //調用fire方法 ak47.fire(); } ……
運行該示例,結果如下:
AK47 is firing
參考答案:(b)。
面試題6 命名Java變量
請命名以下變量。
表1.1 面試題6

考點:該面試題主要考察求職者的編程習慣,良好的編程習慣是一個優秀的Java開發者的必備素質。求職者應該掌握基本的Java命名規范,這樣編寫出來的代碼才能做到夠規范和易讀。
出現頻率:★★★
【面試題解析】在面向對象編程中,對于類、對象變量、方法等的命名是非常有技巧的,例如,大小寫的區分,使用不同字母開頭等。但究其本,追其源,在為一個資源命名時,應該本著描述性和唯一性兩大特征,才能保證資源之間不沖突,并且便于記憶。
1.包的命名
Java包的名字都是由小寫單詞組成。每一名Java程序員都可以編寫屬于自己的Java包,為了保障每個Java包命名的唯一性,最新的Java編程規范,要求程序員在自己定義的包的名稱之前加上唯一的前綴。由于互聯網上的域名是不會重復的,所以程序員一般采用自己在互聯網上的域名作為自己程序包的唯一前綴。
例如:net.frontfree.javagroup。
2.類的命名
類的名字必須由大寫字母開頭,單詞中的其他字母均為小寫。如果類名稱由多個單詞組成,則建議將每個單詞的首字母均用大寫,例如TestPage。如果類名稱中包含單詞縮寫,則建議將這個詞的每個字母均用大寫,如XMLExample。由于類是設計用來代表對象的,所以建議在命名類時應盡量選擇名詞。
3.方法的命名
方法的名字的第1個單詞應以小寫字母作為開頭,后面的單詞則建議用大寫字母開頭。
例如:sendMessge。
4.常量的命名
常量的名字應該都使用大寫字母,并且指出該常量的完整含義。如果一個常量名稱由多個單詞組成,則建議用下劃線來分割這些單詞。
例如:MAX_VALUE。
5.參數的命名
參數的命名規范和方法的命名規范相同,而且為了避免閱讀程序時造成迷惑,請盡量保證在參數名稱為一個單詞的情況下,參數的命名盡可能明確。
6.Javadoc注釋
Java除了可以采用常見的注釋方式之外,Java語言規范還定義了一種特殊的注釋,也就是通常所說的Javadoc注釋,它是用來記錄代碼中的API的。Javadoc注釋是一種多行注釋,以/**開頭,而以*/結束,注釋可以包含一些HTML標記符和專門的關鍵詞。使用Javadoc注釋的好處是編寫的注釋可以被自動轉化為在線文檔,省去了單獨編寫程序文檔的麻煩。例如:
/** *This is an example of * Javadoc * *@author darchon *@version 0.1, 10/11/2002 */
在每個程序的最開始部分,一般都用Javadoc注釋進行程序的總體描述以及版權信息。在主程序中可以為每個類、接口、方法、變量添加Javadoc注釋,每個注釋的開頭部分先用一句話概括該類、接口、方法、變量所完成的功能,這句話應單獨占據一行以突出其概括作用,在這句話后面可以跟隨更加詳細的描述段落。
在描述性段落之后還可以跟隨一些以Javadoc注釋標簽開頭的特殊段落,例如上面例子中的@auther和@version,這些段落將在生成的文檔中以特定方式顯示。
雖然添加注釋不會使一個設計低劣的程序變成好的程序,但是如果按照編程規范編寫程序,并且為程序添加良好的注釋,卻可以幫助編寫出設計優美、運行高效,且易于理解的程序。尤其在多人合作完成同一項目時,編程規范非常重要。俗話說“磨刀不誤砍柴工”,花費一點時間去適應一下Java編程規范是有好處的。
參考答案:(符合命名規則即可。)
表1.2 面試題6答案

面試題7 理解成員
下面關于實例成員的哪一種說法是正確的?
(a)實例成員也被稱為靜態成員。
(b)實例成員總是變量。
(c)實例成員從不是方法。
(d)實例成員隸屬于實例,但不隸屬于整個類。
(e)實例成員總是代表著運算。
考點:考察求職者對于實例成員的理解。
出現頻率:★★★★
【面試題解析】
1.實例成員
對象是以類為藍本創建的類的實例。在類中,一般都定義了類的成員(變量和方法),在創建類的對象時,對象都會擁有類中所定義變量的副本,對象的變量也被稱為實例變量。對象的實例變量的值代表了該對象的狀態,例如ak47對象,其中gun_type的對象變量表明了該對象為“ak47”類型的Gun。如果一個類的兩個對象處于同一個狀態,則它們的某個實例變量應該是相同的。
對象的方法定義了該對象的行為,一般被稱為實例方法。實例方法屬于該類的每個對象,而方法的實現是有所有的類實例共享的。求職者應該加以區別。
隸屬于對象的實例變量和實例方法合稱為對象的實例成員。值得注意的是,應與類的靜態成員相區別,靜態成員只是隸屬于類,而不隸屬于對象。
2.靜態成員
靜態成員隸屬于類,而不屬于任何該類生成的對象,當類加載時就會初始化靜態變量;同樣,靜態方法也是隸屬于類的,而不是對象。靜態變量和靜態方法合稱為靜態成員。例如,類Gun中可以增加gunAmount靜態變量和getGunAmount()靜態方法,如圖1.3所示。

圖1.3 增加靜態成員的UML表示圖
根據圖1.3所示的UML模型,修改后的Gun類代碼如下所示:
public class Gun { // 定義槍的口徑 public Double caliber; // 定義槍的長度 public Double length; // 定義槍的類型 public String gun_type; //定義靜態變量 public static int gunAmount; // 構造方法 public Gun() { gunAmount++; } // 帶參數的構造方法 public Gun(String name) { gunAmount++; } // 開火的方法 public void fire() { System.out.println(gun_type +" is firing"); } // 維護的方法 public Boolean maintenance() { return true; } //獲得靜態變量值 public static int getGunAmount(){ return gunAmount; } }
測試方法代碼如下所示:
…… public static void main(String[] args) { //建立Gun類對象,即Gun類的實例ak47 Gun ak47=new Gun(); //使用帶參數的構造方法 Gun m16=new Gun("M16 Gun"); //打印類的靜態變量值 System.out.println("Zhe Gun Amount is:"+Gun.gunAmount); //定義ak47的口徑 ak47.caliber=7.6; //定義ak47的長度 ak47.length=57.8; //定義ak47的類型 ak47.gun_type="AK47"; //調用fire方法 ak47.fire(); } ……
運行該測試方法,結果如下:
Zhe Gun Amount is:2 AK47 is firing
可見,靜態成員只隸屬于類,而不是對象。表1.3給出了類成員的相關解釋。
表1.3 類成員的相關術語

參考答案:(d)。
面試題8 在Java中,對象是如何傳遞消息的
請選擇一個正確答案。
(a)對象通過彼此的變量來傳遞消息。
(b)對象通過修改彼此類的靜態變量來傳遞消息。
(c)對象通過調用彼此的實例方法來傳遞消息。
(d)對象通過調用彼此類的靜態方法來傳遞消息。
考點:考察求職者對于對象傳遞消息的理解。
出現頻率:★★
面試題解析Java對象之間的消息傳遞,是通過調用相互的實例方法來實現的,而不是靜態方法。
參考答案:(c)。
面試題9 對于類的靜態變量的理解
運行下面程序,請選擇輸出結果。
public class x { private static int a; public static void main(String[] args) { modify(a); System.out.println(a); } public static void modify(int a) { a++; } }
(a)0
(b)1
(c)2
(d)3
考點:考察求職者對于類的靜態變量的理解。
出現頻率:★★★★
【面試題解析】類的靜態變量a在modify()方法中并沒有被改變,而是改變了modify()方法的參數。如果將上述代碼修改如下:
public class x { private static int a; public static void main(String[] args) { modify(a); System.out.println(a); } public static void modify(int a) { a++; } }
那么輸出結果為1,但是面試題中靜態變量a的值并沒有改變,所以應該輸出為0。
參考答案:(a)。
面試題10 類繼承的建模表示方法
根據圖1.4的UML表示,選擇一個正確的描述。

圖1.4 UML表示圖
(a)Box類是MyBox類的子類。
(b)Box類是MyBox類的父類。
(c)Box類和MyBox類是聚合關系。
(d)Box類和MyBox類是一對多關系。
考點:該面試題貌似簡單,在實際的面試中回答正確的卻并不是很多,其實只是考察求職者對類的繼承的建模表示方法的掌握程度。
出現頻率:★★★
【面試題解析】Java中有兩種機制來保證根據現有的類來構造新的類,那就是繼承和聚合。例如,有一個盒子的類Box,開發者就可以根據類Box來構造各種細化的盒子類,因為所有的細化盒子類都是類Box的一種,這是一種繼承的關系。
在UML建模表示圖中,繼承使用一個空心的三角箭頭來表示,該箭頭的方向是由子類指向父類的,表明子類依賴于父類,如圖1.5所示。

圖1.5 類的繼承UML表示圖
在Java中,要從現有的類構造出新的類,需要在子類的定義中使用extends子句。值得注意的是,在Java中,子類只能擴展一種父類,子類將繼承超類的成員。示例代碼如下:
//定義父類Box class Box { //默認屬性可以被繼承 int high; //private不能被繼承 private static String location; private int counter; //protected可以被繼承 protected boolean isFull; //構造函數 Box() { high = 20; location = "Room"; counter = 1; isFull = true; } public static void printLocation() { System.out.println("Location:" + location); } private void printCounter() { System.out.println("Number of boxs::" + counter); } public boolean isFull() { return isFull; } public int getCounter() { return counter; } public void doLoad() { isFull = true; } public void doRemove() { isFull = false; } } //子類 class MyBox extends Box { private int length = 99; private int colorNo = 45; //覆蓋父類屬性 private int high=120; public int getLength() { return length; } public void printInfo() { System.out.println("Length:" + getLength()); System.out.println("ColorNo:" + colorNo); System.out.println("High:" + high); System.out.println("isFull:" + isFull); System.out.println("Counter:" + getCounter()); printLocation(); } }
編寫一個子類的測試類,其測試方法如下:
public static void main(String[] args) { MyBox mybox = new MyBox(); mybox.printInfo(); }
運行結果如下:
Length:99 ColorNo:45 High:120 isFull:true Counter:1 Location:Room
可見,子類繼承了父類的成員。
參考答案:(b)。
面試題11 使用jar命令
請使用jar命令,將test文件夾壓縮成.jar文件,并簡述其壓縮包的結構。
考點:對于Java程序員來說,更多情況下是使用的集成Java開發工具,例如JBuilder、Eclipse等,而對于最基本的Java編譯和常見的命令行工具往往都不熟悉。這個面試題主要考察求職者對于Java命令行基本工具的使用,從而了解求職者對Java編程的熟悉程度。
出現頻率:★★★
【面試題解析】熟練的Java開發者應該掌握常用的Java命令行工具。求職者應該熟練掌握javac、java和jar等工具。
1.javac
javac是JDK的標準編譯工具,常見的形式為:javac <選項> <源文件>。它可能的選項包括下面各項。
? -g:生成所有調試信息。
? -g:none:生成無調試信息。
? -g:{lines,vars,source}:生成只有部分調試信息。
? -nowarn:生成無警告。
? -verbose:輸出關于編譯器正在做的信息。
? -deprecation:輸出使用了不鼓勵使用的API的源程序位置。
? -classpath <路徑>:指定用戶類文件的位置。
? -sourcepath <路徑>:指定輸入源文件的位置。
? -bootclasspath <路徑>:覆蓋自舉類文件的位置。
? -extdirs <目錄(多個)>:覆蓋安裝的擴展類的位置。
? -d <目錄>:指定輸出類文件的位置。
? -encoding <編碼>:指定源文件中所用的字符集編碼。
? -target <版本>:生成指定虛擬機版本的類文件。
常見的問題:在使用javac編譯.java源文件時找不到jar包,則需使用-classpath選項。例如:
javac -classpath .;jar01.jar;jar01.jar;……;jarN.jar class_name.java
使用-classpath選項,指定了在編譯Java源代碼時,用到類庫的位置。一般用于該類庫不在當前CLASSPATH的環境變量中。
2.java
java命令是JDK默認的java執行程序,在這里值得注意的是,在執行帶包的.class文件時,需要使用標準的Java包形式。例如:
java com.nsfc.hello
3.jar
隨著JDK安裝,在JDK安裝目錄下的bin目錄中存在一個可執行文件,Windows下文件名為jar.exe,Linux下文件名為jar。它的運行需要用到JDK安裝目錄下lib目錄中的tools.jar文件。jar命令行格式為:
jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C目錄] 文件名
其中{ctxu}是jar命令的子命令,每次jar命令只能包含一個子命令,這些子命令的含義如下所述。
? -c創建新的JAR文件包。
? -t列出JAR文件包的內容列表。
? -x展開JAR文件包的指定文件或者所有文件。
? -u更新已存在的JAR文件包(添加文件到JAR文件包中)。
[vfm0M]中的選項可以任選,也可以不選,它們是jar命令的選項參數。
? -v生成具體報告,并打印到標準輸出。
? -f指定JAR文件名,通常這個參數是必須的。
? -m指定需要包含的MANIFEST清單文件。
? -0只存儲,不壓縮,這樣產生的JAR文件包會比不用該參數產生的體積大,但速度更快。
? -M不產生所有項的清單(MANIFEST〕文件,此參數會忽略-m參數。
[jar-文件]:即需要生成、查看、更新或者解開的JAR文件包,它是-f參數的附屬參數。
[manifest-文件]:即MANIFEST清單文件,它是-m參數的附屬參數。
[-C目錄]:表示轉到指定目錄下去執行這個jar命令的操作。它相當于先使用cd命令轉到該目錄下,再執行不帶-c參數的jar命令,它只能在創建和更新JAR文件包的時候使用。
文件名:指定一個文件/目錄列表,這些文件/目錄就是要添加到JAR文件包中的文件/目錄。假如指定了目錄,那么jar命令打包的時候會自動把該目錄中的所有文件和子目錄打入包中。
使用JDK的jar命令打包,會自動在壓縮包中生成一個META-INF目錄,其中有一個MANIFEST.MF文件。
使用jar命令進行如下壓縮:
jar cf test.jar test
即將當前目錄下的test目錄所有文件壓縮到test.jar文件中,使用WinRaR軟件可以看到該壓縮文件的目錄,結果如圖1.6所示。

圖1.6 jar壓縮文檔的結構
參考答案:
可以使用“jar cf test.jar test”命令來完成壓縮。在壓縮包中,包含一個test文件夾和一個META-INF文件夾,其中有一個MANIFEST.MF文件。
面試題12 如何執行mian()方法
利用Java SDK中哪一條命令能夠執行test的main()方法?
(a)java test
(b)javac test
(c)java test.java
(d)java test.class
(e)java test.main
考點:考察求職者對java命令的熟悉程度。
出現頻率:★★★
【面試題解析】求職者容易出現的錯誤是選擇了(d)。實際上,java命令后面只需要class文件的名稱就可以,不用加入.class全名。如果使用java test.class命令,系統會認為這是一個包的結構,會查找test.class.class文件。會出現如下異常信息:
Exception in thread “main” java.lang.NoClassDefaultError:test/class
提示找不到相應的類文件。
參考答案:(a)。
面試題13 Java開發原則
請選擇下面Java語言描述正確的項。
(a)Java的開發都是封裝到類中的。
(b)Java中只有一種值:元數據類型值。
(c)引用代表那些根據類創建的對象。
(d)對象可以通過多種方式加以操作。
考點:考察求職者對Java開發原則的理解。
出現頻率:★★★
面試題解析Java開發一般遵循以下幾個原則:
? Java中的代碼必須封裝到類中。
? Java中有兩種值:對象的引用和元數據類型值。
? 引用代表根據類創建的對象。
? 對象只能通過引用加以操作。
? Java中的對象不能包含其他對象,對象只能擁有指向其他對象的引用。
參考答案:(a)、(c)。