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

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

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

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

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

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

參考答案:(d)。
面試題8 在Java中,對(duì)象是如何傳遞消息的
請(qǐng)選擇一個(gè)正確答案。
(a)對(duì)象通過彼此的變量來傳遞消息。
(b)對(duì)象通過修改彼此類的靜態(tài)變量來傳遞消息。
(c)對(duì)象通過調(diào)用彼此的實(shí)例方法來傳遞消息。
(d)對(duì)象通過調(diào)用彼此類的靜態(tài)方法來傳遞消息。
考點(diǎn):考察求職者對(duì)于對(duì)象傳遞消息的理解。
出現(xiàn)頻率:★★
面試題解析Java對(duì)象之間的消息傳遞,是通過調(diào)用相互的實(shí)例方法來實(shí)現(xiàn)的,而不是靜態(tài)方法。
參考答案:(c)。
面試題9 對(duì)于類的靜態(tài)變量的理解
運(yùn)行下面程序,請(qǐng)選擇輸出結(jié)果。
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
考點(diǎn):考察求職者對(duì)于類的靜態(tài)變量的理解。
出現(xiàn)頻率:★★★★
【面試題解析】類的靜態(tài)變量a在modify()方法中并沒有被改變,而是改變了modify()方法的參數(shù)。如果將上述代碼修改如下:
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++; } }
那么輸出結(jié)果為1,但是面試題中靜態(tài)變量a的值并沒有改變,所以應(yīng)該輸出為0。
參考答案:(a)。
面試題10 類繼承的建模表示方法
根據(jù)圖1.4的UML表示,選擇一個(gè)正確的描述。

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

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

圖1.6 jar壓縮文檔的結(jié)構(gòu)
參考答案:
可以使用“jar cf test.jar test”命令來完成壓縮。在壓縮包中,包含一個(gè)test文件夾和一個(gè)META-INF文件夾,其中有一個(gè)MANIFEST.MF文件。
面試題12 如何執(zhí)行mian()方法
利用Java SDK中哪一條命令能夠執(zhí)行test的main()方法?
(a)java test
(b)javac test
(c)java test.java
(d)java test.class
(e)java test.main
考點(diǎn):考察求職者對(duì)java命令的熟悉程度。
出現(xiàn)頻率:★★★
【面試題解析】求職者容易出現(xiàn)的錯(cuò)誤是選擇了(d)。實(shí)際上,java命令后面只需要class文件的名稱就可以,不用加入.class全名。如果使用java test.class命令,系統(tǒng)會(huì)認(rèn)為這是一個(gè)包的結(jié)構(gòu),會(huì)查找test.class.class文件。會(huì)出現(xiàn)如下異常信息:
Exception in thread “main” java.lang.NoClassDefaultError:test/class
提示找不到相應(yīng)的類文件。
參考答案:(a)。
面試題13 Java開發(fā)原則
請(qǐng)選擇下面Java語言描述正確的項(xiàng)。
(a)Java的開發(fā)都是封裝到類中的。
(b)Java中只有一種值:元數(shù)據(jù)類型值。
(c)引用代表那些根據(jù)類創(chuàng)建的對(duì)象。
(d)對(duì)象可以通過多種方式加以操作。
考點(diǎn):考察求職者對(duì)Java開發(fā)原則的理解。
出現(xiàn)頻率:★★★
面試題解析Java開發(fā)一般遵循以下幾個(gè)原則:
? Java中的代碼必須封裝到類中。
? Java中有兩種值:對(duì)象的引用和元數(shù)據(jù)類型值。
? 引用代表根據(jù)類創(chuàng)建的對(duì)象。
? 對(duì)象只能通過引用加以操作。
? Java中的對(duì)象不能包含其他對(duì)象,對(duì)象只能擁有指向其他對(duì)象的引用。
參考答案:(a)、(c)。
- GitLab CI/CD 從入門到實(shí)戰(zhàn)
- OpenNI體感應(yīng)用開發(fā)實(shí)戰(zhàn)
- Swift權(quán)威指南
- 學(xué)校沒教的軟件工程課
- Swift從入門到精通(正式版)
- 中國(guó)軟件工程師:工作、生活與觀念
- Unity AR/VR開發(fā):從新手到專家
- 邊緣云部署與運(yùn)營(yíng):系統(tǒng)性實(shí)現(xiàn)方法
- 移動(dòng)終端應(yīng)用軟件開發(fā)實(shí)戰(zhàn)
- 現(xiàn)代交換技術(shù)(第3版)
- 實(shí)時(shí)分析實(shí)戰(zhàn):構(gòu)建實(shí)時(shí)流處理應(yīng)用和分析系統(tǒng)
- C++從入門到精通(第2版)
- 零基礎(chǔ)輕松學(xué)Python:青少年趣味編程(全彩版)
- 解構(gòu)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)
- AR Foundation增強(qiáng)現(xiàn)實(shí)開發(fā)實(shí)戰(zhàn)(ARKit版)