官术网_书友最值得收藏!

  • Java程序員面試秘笈
  • 陳浩編著
  • 872字
  • 2019-01-02 07:03:43

第1章 Java編程基礎(chǔ)

通過(guò)考察Java編程基礎(chǔ),用人單位可以了解求職者對(duì)Java語(yǔ)言的理解程度和熟練程度,一個(gè)熟練、具備開(kāi)發(fā)經(jīng)驗(yàn)的程序員,可以輕松地解答相關(guān)問(wèn)題。而對(duì)于剛剛準(zhǔn)備步入職場(chǎng)的新人,由于基礎(chǔ)不扎實(shí),準(zhǔn)備不充分,Java基礎(chǔ)編程方面的面試題往往會(huì)給他們?cè)斐梢欢ǖ睦_。值得注意的是,企業(yè)和學(xué)校對(duì)Java基礎(chǔ)考察的方向有很大的不同,往往求職者對(duì)哪些編程基礎(chǔ)必須掌握沒(méi)有一個(gè)清醒的認(rèn)識(shí),不知道企業(yè)需要考察哪方面的知識(shí),這樣會(huì)失去很多可貴的機(jī)會(huì)。

本章通過(guò)真實(shí)的試題,從多個(gè)角度講解Java編程基礎(chǔ)部分的考點(diǎn),使求職者能夠快速領(lǐng)會(huì)用人單位的需求,提高自己在應(yīng)聘中成功的幾率。

求職者需要熟練掌握以下知識(shí)點(diǎn)。

? Java的安裝與調(diào)試,重點(diǎn)是Java環(huán)境的配置。

? Java開(kāi)發(fā)中基本術(shù)語(yǔ)和基本概念。

? 理解類、對(duì)象、引用、變量、方法和成員。

? 熟練掌握J(rèn)ava的調(diào)試和運(yùn)行。

? 了解和掌握常用的Java開(kāi)發(fā)工具。

面試題1 簡(jiǎn)單描述Java開(kāi)發(fā)包的種類

考點(diǎn):考察求職者對(duì)于Java體系的認(rèn)識(shí),屬于Java程序員的必備知識(shí)。

出現(xiàn)頻率:★★★

面試題解析】隨著Java語(yǔ)言的成長(zhǎng)和壯大,Java的開(kāi)發(fā)包根據(jù)用途的不同已經(jīng)分為Java EE、Java SE和Java ME 3個(gè)開(kāi)發(fā)包,求職者需要列出名稱,并具體描述每個(gè)開(kāi)發(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è)備的開(kāi)發(fā)人員的最佳選擇。

? Java SE:(Java Platform Standard Edition)是針對(duì)桌面開(kāi)發(fā)以及低端商務(wù)計(jì)算解決方案而開(kāi)發(fā)的版本。

? Java EE:(Java Platform Enterprise Edition)是一種利用Java平臺(tái)來(lái)簡(jiǎn)化企業(yè)解決方案的開(kāi)發(fā)、部署和管理相關(guān)的復(fù)雜問(wèn)題的體系結(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)有深刻的理解。所以常見(jiàn)的面試題中都會(huì)出現(xiàn)考察求職者對(duì)OOP理解方面的題目。

面試題2 Java語(yǔ)言的特性有哪些

考點(diǎn):考察求職者對(duì)Java語(yǔ)言的認(rèn)識(shí)。

出現(xiàn)頻率:★★

面試題解析】需要求職者列出Java語(yǔ)言的幾個(gè)重要特點(diǎn)。答題時(shí)只需要寫(xiě)出特點(diǎn),一般不需要詳細(xì)解釋。下面參考答案中給出了相應(yīng)的詳細(xì)描述,供讀者參考,同時(shí)加強(qiáng)理解。

參考答案:

Java語(yǔ)言是一個(gè)面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。Java語(yǔ)言吸收了Smalltalk語(yǔ)言和C++語(yǔ)言的優(yōu)點(diǎn),并增加了其他特性,如支持并發(fā)程序設(shè)計(jì)、網(wǎng)絡(luò)通信和多媒體數(shù)據(jù)控制等。主要特性如下。

(1)Java語(yǔ)言是簡(jiǎn)單的。一方面,Java語(yǔ)言的語(yǔ)法與C語(yǔ)言和C++語(yǔ)言很接近,大多數(shù)程序員很容易學(xué)習(xí)和使用Java。另一方面,Java丟棄了C++中使用頻率相對(duì)較少的、較難理解的一些特性,如操作符重載、多繼承、自動(dòng)的強(qiáng)制類型轉(zhuǎn)換。特別地,Java語(yǔ)言不使用指針,并提供了自動(dòng)的廢料收集,使得程序員不必為內(nèi)存管理而擔(dān)憂。

(2)Java語(yǔ)言是面向?qū)ο蟮摹ava語(yǔ)言提供類、接口和繼承等特性,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實(shí)現(xiàn)機(jī)制(關(guān)鍵字為implements)。Java語(yǔ)言全面支持動(dòng)態(tài)綁定,而C++語(yǔ)言只對(duì)虛函數(shù)使用動(dòng)態(tài)綁定。總之,Java語(yǔ)言是一個(gè)單純的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。

(3)Java語(yǔ)言是分布式的。Java語(yǔ)言支持Internet應(yīng)用的開(kāi)發(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ī)制也是開(kāi)發(fā)分布式應(yīng)用的重要手段。

(4)Java語(yǔ)言是健壯的。強(qiáng)類型機(jī)制、異常處理機(jī)制、垃圾回收機(jī)制、安全檢查機(jī)制等是Java程序健壯性的重要保證。對(duì)指針的丟棄是Java的明智選擇。

(5)Java語(yǔ)言是安全的。Java通常被用在網(wǎng)絡(luò)環(huán)境中,以防惡意代碼的攻擊。除了Java語(yǔ)言具有的許多安全特性以外,Java對(duì)通過(guò)網(wǎng)絡(luò)下載的類本身具有一個(gè)安全防范機(jī)制,通過(guò)分配不同的名字空間,以防替代本地的同名類和字節(jié)代碼檢查,并提供安全管理機(jī)制(類SecurityManager)讓Java應(yīng)用設(shè)置安全哨兵。

(6)Java語(yǔ)言是跨平臺(tái)的。Java程序在Java平臺(tái)上被編譯為體系結(jié)構(gòu)中立的字節(jié)碼格式(后綴為class的文件),可以在任何操作系統(tǒng)中的Java虛擬機(jī)上運(yùn)行。

(7)Java語(yǔ)言是多線程的。Java語(yǔ)言支持多個(gè)線程的同時(shí)執(zhí)行,并提供多線程之間的同步機(jī)制(關(guān)鍵字為synchronized)。

面試題3 Linux操作系統(tǒng)下如何安裝Java SE開(kāi)發(fā)環(huán)境

考點(diǎn):由于大部分的計(jì)算機(jī)用戶都使用Windows作為操作系統(tǒng),而Java語(yǔ)言是具有跨平臺(tái)優(yōu)勢(shì)的,不同企業(yè)有不同的開(kāi)發(fā)環(huán)境,本試題考察求職者是否有在Linux下開(kāi)發(fā)Java的經(jīng)驗(yàn)。Linux環(huán)境下的Java安裝是一個(gè)基礎(chǔ)問(wèn)題。

出現(xiàn)頻率:★★★

面試題解析】該問(wè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開(kāi)發(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)境,如果開(kāi)發(fā)Java程序,必須安裝JDK。

(1)首先到Sun的網(wǎng)站上去下載JDK,截止本書(shū)編寫(xiě)時(shí)最新版本為Java 7 update 21,下載jdk-7u21-linux-i586.tar.gz文件。

(2)把安裝文件解壓出來(lái)。假設(shè)下載的文件保存在/opt下。打開(kāi)終端,運(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開(kāi)發(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__HOMECLASSPATH這2個(gè)環(huán)境變量即可。Linux配置中,多個(gè)路徑直接使用“:”連接,而Windows操作系統(tǒng)中則使用“,”來(lái)連接。為了方便Java程序的編譯,特別是使用javac來(lái)進(jìn)行編譯的情況下,需要在CLASSPATH中加入“.”,即當(dāng)前路徑。

面試題4 列出你熟悉的Java開(kāi)發(fā)工具

考點(diǎn):該問(wèn)題一般會(huì)在面試時(shí)出現(xiàn),主要是看求職者是否熟悉常用的Java開(kāi)發(fā)工具,因?yàn)橐粋€(gè)項(xiàng)目開(kāi)發(fā)團(tuán)隊(duì)會(huì)使用一種固定的開(kāi)發(fā)工具,只有求職者能夠熟練使用該工具,才能夠快速融入該團(tuán)隊(duì)。

出現(xiàn)頻率:★★★★★

面試題解析】Java作為一種跨平臺(tái)開(kāi)發(fā)語(yǔ)言,由于其開(kāi)源性,各個(gè)公司和社區(qū)組織,都推出了各自的Java開(kāi)發(fā)工具,這也是Java開(kāi)發(fā)體系同微軟的開(kāi)發(fā)體系的區(qū)別之一。不同的項(xiàng)目開(kāi)發(fā)團(tuán)隊(duì)一般都有自己熟悉的開(kāi)發(fā)工具或者開(kāi)發(fā)環(huán)境,求職者只有熟練使用不同的開(kāi)發(fā)工具,才能適應(yīng)項(xiàng)目開(kāi)發(fā)需要,得到用人單位的認(rèn)同,增加成功的把握。從國(guó)內(nèi)的情況來(lái)看,大多數(shù)都是使用JBuilder和Eclipse作為項(xiàng)目開(kāi)發(fā)的首選工具,所以,求職者應(yīng)該至少掌握其一。

參考答案:

常見(jiàn)的Java開(kāi)發(fā)工具如下所述。

(1)JDK(Java Development Kit)Java開(kāi)發(fā)工具:最基本的開(kāi)發(fā)工具,必須掌握。

(2)Borland的JBuilder:JBuilder是歷史比較悠久的Java集成開(kāi)發(fā)環(huán)境,也是要求求職者需要掌握的。不過(guò)目前很多開(kāi)發(fā)團(tuán)隊(duì)并不使用JBuilder作為開(kāi)發(fā)工具,因?yàn)樗且粋€(gè)商業(yè)性的產(chǎn)品,需要付費(fèi)。

(3)Oracle的JDeveloper:最新版本為11g,是Oracle公司提供的開(kāi)發(fā)工具,它為構(gòu)建具有J2EE功能的、多層的Java應(yīng)用程序提供了一個(gè)完全集成的開(kāi)發(fā)環(huán)境。目前國(guó)內(nèi)使用率比較低,對(duì)于初學(xué)者來(lái)說(shuō),較復(fù)雜,也比較難。

(4)IBM的Visual Age for Java:Visual Age for Java是一個(gè)非常成熟的開(kāi)發(fā)工具,它的特性對(duì)于IT開(kāi)發(fā)者和業(yè)余的Java編程人員來(lái)說(shuō)都是非常有用的。但是在國(guó)內(nèi),它也不是Java應(yīng)用開(kāi)發(fā)的主流工具。

(5)Eclipse:Eclipse是一種可擴(kuò)展的開(kāi)放源代碼的集成開(kāi)發(fā)環(huán)境。Eclipse發(fā)展最快,得到了國(guó)內(nèi)外大多數(shù)程序員的肯定,目前已經(jīng)成為主流的Java開(kāi)發(fā)工具。Eclipse的最大特點(diǎn)是能接受由Java開(kāi)發(fā)者自己編寫(xiě)的開(kāi)放源代碼插件,同時(shí)Eclipse為工具開(kāi)發(fā)商提供了更好的靈活性,使他們能更好地控制自己的軟件技術(shù)。

Eclipse可以說(shuō)是求職者必須掌握的一個(gè)Java開(kāi)發(fā)工具,缺點(diǎn)就是較復(fù)雜,對(duì)初學(xué)者來(lái)說(shuō),使用起來(lái)比較困難。

注意:此面試題的目的是了解求職者對(duì)于Java開(kāi)發(fā)工具的認(rèn)識(shí)和掌握。回答此類問(wèn)題時(shí),不必列出所有的開(kāi)發(fā)工具。實(shí)際上,Java開(kāi)發(fā)工具是非常多的,除了這里列出的之外,還有Microsoft VJ++、JCreator、Intellij IDEA和BEA的WebLogic Workshop等。求職者一般只要熟練使用JBuilder和Eclipse就可以滿足大部分的國(guó)內(nèi)開(kāi)發(fā)要求。值得注意的是,有些特別的公司,例如IBM會(huì)要求求職者熟悉IBM的Visual Age for Java,這就要求求職者在面試之前一定要先了解該公司的大致情況,做好相關(guān)的準(zhǔn)備。

面試題5 用自己的語(yǔ)言描述Java中的類和對(duì)象

下列關(guān)于對(duì)象的哪一種說(shuō)法是正確的?請(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ì)象來(lái)建立抽象模型。

類表示了對(duì)象的類別,是創(chuàng)建對(duì)象的藍(lán)本。建立一個(gè)事物的抽象模型,本質(zhì)上就是表達(dá)該事物的性質(zhì)和行為。使用類來(lái)建立抽象模型,是通過(guò)在類中定義變量和方法來(lái)實(shí)現(xiàn)的。

類中定義的屬性是一種可存儲(chǔ)值的變量,該變量代表著事物的具體性質(zhì)。類的對(duì)象所具有的行是由定義的方法來(lái)實(shí)現(xiàn)的。類中定義的變量和方法被稱為類的成員。

在項(xiàng)目開(kāi)發(fā)中,類一般可以通過(guò)UML建模來(lái)表示,如圖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的開(kāi)火行為,及fire方法。

? maintenance:定義了Gun的維護(hù)方法。

? Gun:定義了一個(gè)同類同名的構(gòu)造方法。

開(kāi)發(fā)者可以通過(guò)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) {
              }
              // 開(kāi)火的方法
              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ì)象的過(guò)程叫做實(shí)例化。對(duì)象是類所表示的抽象事物的具體實(shí)例。例如前面所講述的Gun類,那么可以根據(jù)Gun類創(chuàng)建一個(gè)ak47的對(duì)象,即Gun的具體實(shí)現(xiàn)。

對(duì)象可以使用UML來(lái)表示,如圖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開(kāi)發(fā)者的必備素質(zhì)。求職者應(yīng)該掌握基本的Java命名規(guī)范,這樣編寫(xiě)出來(lái)的代碼才能做到夠規(guī)范和易讀。

出現(xiàn)頻率:★★★

面試題解析】在面向?qū)ο缶幊讨校瑢?duì)于類、對(duì)象變量、方法等的命名是非常有技巧的,例如,大小寫(xiě)的區(qū)分,使用不同字母開(kāi)頭等。但究其本,追其源,在為一個(gè)資源命名時(shí),應(yīng)該本著描述性和唯一性兩大特征,才能保證資源之間不沖突,并且便于記憶。

1.包的命名

Java包的名字都是由小寫(xiě)單詞組成。每一名Java程序員都可以編寫(xiě)屬于自己的Java包,為了保障每個(gè)Java包命名的唯一性,最新的Java編程規(guī)范,要求程序員在自己定義的包的名稱之前加上唯一的前綴。由于互聯(lián)網(wǎng)上的域名是不會(huì)重復(fù)的,所以程序員一般采用自己在互聯(lián)網(wǎng)上的域名作為自己程序包的唯一前綴。

例如:net.frontfree.javagroup。

2.類的命名

類的名字必須由大寫(xiě)字母開(kāi)頭,單詞中的其他字母均為小寫(xiě)。如果類名稱由多個(gè)單詞組成,則建議將每個(gè)單詞的首字母均用大寫(xiě),例如TestPage。如果類名稱中包含單詞縮寫(xiě),則建議將這個(gè)詞的每個(gè)字母均用大寫(xiě),如XMLExample。由于類是設(shè)計(jì)用來(lái)代表對(duì)象的,所以建議在命名類時(shí)應(yīng)盡量選擇名詞。

3.方法的命名

方法的名字的第1個(gè)單詞應(yīng)以小寫(xiě)字母作為開(kāi)頭,后面的單詞則建議用大寫(xiě)字母開(kāi)頭。

例如:sendMessge。

4.常量的命名

常量的名字應(yīng)該都使用大寫(xiě)字母,并且指出該常量的完整含義。如果一個(gè)常量名稱由多個(gè)單詞組成,則建議用下劃線來(lái)分割這些單詞。

例如:MAX_VALUE。

5.參數(shù)的命名

參數(shù)的命名規(guī)范和方法的命名規(guī)范相同,而且為了避免閱讀程序時(shí)造成迷惑,請(qǐng)盡量保證在參數(shù)名稱為一個(gè)單詞的情況下,參數(shù)的命名盡可能明確。

6.Javadoc注釋

Java除了可以采用常見(jiàn)的注釋方式之外,Java語(yǔ)言規(guī)范還定義了一種特殊的注釋,也就是通常所說(shuō)的Javadoc注釋,它是用來(lái)記錄代碼中的API的。Javadoc注釋是一種多行注釋,以/**開(kāi)頭,而以*/結(jié)束,注釋可以包含一些HTML標(biāo)記符和專門(mén)的關(guān)鍵詞。使用Javadoc注釋的好處是編寫(xiě)的注釋可以被自動(dòng)轉(zhuǎn)化為在線文檔,省去了單獨(dú)編寫(xiě)程序文檔的麻煩。例如:

        /**
        *This is an example of
        * Javadoc
        *
        *@author darchon
        *@version 0.1, 10/11/2002
        */

在每個(gè)程序的最開(kāi)始部分,一般都用Javadoc注釋進(jìn)行程序的總體描述以及版權(quán)信息。在主程序中可以為每個(gè)類、接口、方法、變量添加Javadoc注釋,每個(gè)注釋的開(kāi)頭部分先用一句話概括該類、接口、方法、變量所完成的功能,這句話應(yīng)單獨(dú)占據(jù)一行以突出其概括作用,在這句話后面可以跟隨更加詳細(xì)的描述段落。

在描述性段落之后還可以跟隨一些以Javadoc注釋標(biāo)簽開(kāi)頭的特殊段落,例如上面例子中的@auther和@version,這些段落將在生成的文檔中以特定方式顯示。

雖然添加注釋不會(huì)使一個(gè)設(shè)計(jì)低劣的程序變成好的程序,但是如果按照編程規(guī)范編寫(xiě)程序,并且為程序添加良好的注釋,卻可以幫助編寫(xiě)出設(shè)計(jì)優(yōu)美、運(yùn)行高效,且易于理解的程序。尤其在多人合作完成同一項(xiàng)目時(shí),編程規(guī)范非常重要。俗話說(shuō)“磨刀不誤砍柴工”,花費(fèi)一點(diǎn)時(shí)間去適應(yīng)一下Java編程規(guī)范是有好處的。

參考答案:(符合命名規(guī)則即可。)

表1.2 面試題6答案

面試題7 理解成員

下面關(guān)于實(shí)例成員的哪一種說(shuō)法是正確的?

(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++;
              }
              // 開(kāi)火的方法
              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

可見(jiàn),靜態(tài)成員只隸屬于類,而不是對(duì)象。表1.3給出了類成員的相關(guān)解釋。

表1.3 類成員的相關(guān)術(shù)語(yǔ)

參考答案:(d)。

面試題8 在Java中,對(duì)象是如何傳遞消息的

請(qǐng)選擇一個(gè)正確答案。

(a)對(duì)象通過(guò)彼此的變量來(lái)傳遞消息。

(b)對(duì)象通過(guò)修改彼此類的靜態(tài)變量來(lái)傳遞消息。

(c)對(duì)象通過(guò)調(diào)用彼此的實(shí)例方法來(lái)傳遞消息。

(d)對(duì)象通過(guò)調(diào)用彼此類的靜態(tài)方法來(lái)傳遞消息。

考點(diǎn):考察求職者對(duì)于對(duì)象傳遞消息的理解。

出現(xiàn)頻率:★★

面試題解析Java對(duì)象之間的消息傳遞,是通過(guò)調(diào)用相互的實(shí)例方法來(lái)實(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()方法中并沒(méi)有被改變,而是改變了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的值并沒(méi)有改變,所以應(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ī)制來(lái)保證根據(jù)現(xiàn)有的類來(lái)構(gòu)造新的類,那就是繼承和聚合。例如,有一個(gè)盒子的類Box,開(kāi)發(fā)者就可以根據(jù)類Box來(lái)構(gòu)造各種細(xì)化的盒子類,因?yàn)樗械募?xì)化盒子類都是類Box的一種,這是一種繼承的關(guān)系。

在UML建模表示圖中,繼承使用一個(gè)空心的三角箭頭來(lái)表示,該箭頭的方向是由子類指向父類的,表明子類依賴于父類,如圖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();
              }
        }

編寫(xiě)一個(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

可見(jiàn),子類繼承了父類的成員。

參考答案:(b)。

面試題11 使用jar命令

請(qǐng)使用jar命令,將test文件夾壓縮成.jar文件,并簡(jiǎn)述其壓縮包的結(jié)構(gòu)。

考點(diǎn):對(duì)于Java程序員來(lái)說(shuō),更多情況下是使用的集成Java開(kāi)發(fā)工具,例如JBuilder、Eclipse等,而對(duì)于最基本的Java編譯和常見(jiàn)的命令行工具往往都不熟悉。這個(gè)面試題主要考察求職者對(duì)于Java命令行基本工具的使用,從而了解求職者對(duì)Java編程的熟悉程度。

出現(xiàn)頻率:★★★

面試題解析】熟練的Java開(kāi)發(fā)者應(yīng)該掌握常用的Java命令行工具。求職者應(yīng)該熟練掌握javac、java和jar等工具。

1.javac

javac是JDK的標(biāo)準(zhǔn)編譯工具,常見(jiàn)的形式為:javac <選項(xiàng)> <源文件>。它可能的選項(xiàng)包括下面各項(xiàng)。

? -g:生成所有調(diào)試信息。

? -g:none:生成無(wú)調(diào)試信息。

? -g:{lines,vars,source}:生成只有部分調(diào)試信息。

? -nowarn:生成無(wú)警告。

? -verbose:輸出關(guān)于編譯器正在做的信息。

? -deprecation:輸出使用了不鼓勵(lì)使用的API的源程序位置。

? -classpath <路徑>:指定用戶類文件的位置。

? -sourcepath <路徑>:指定輸入源文件的位置。

? -bootclasspath <路徑>:覆蓋自舉類文件的位置。

? -extdirs <目錄(多個(gè))>:覆蓋安裝的擴(kuò)展類的位置。

? -d <目錄>:指定輸出類文件的位置。

? -encoding <編碼>:指定源文件中所用的字符集編碼。

? -target <版本>:生成指定虛擬機(jī)版本的類文件。

常見(jiàn)的問(wèn)題:在使用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目錄](méi) 文件名

其中{ctxu}是jar命令的子命令,每次jar命令只能包含一個(gè)子命令,這些子命令的含義如下所述。

? -c創(chuàng)建新的JAR文件包。

? -t列出JAR文件包的內(nèi)容列表。

? -x展開(kāi)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-文件]:即需要生成、查看、更新或者解開(kāi)的JAR文件包,它是-f參數(shù)的附屬參數(shù)。

[manifest-文件]:即MANIFEST清單文件,它是-m參數(shù)的附屬參數(shù)。

[-C目錄](méi):表示轉(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”命令來(lái)完成壓縮。在壓縮包中,包含一個(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開(kāi)發(fā)原則

請(qǐng)選擇下面Java語(yǔ)言描述正確的項(xiàng)。

(a)Java的開(kāi)發(fā)都是封裝到類中的。

(b)Java中只有一種值:元數(shù)據(jù)類型值。

(c)引用代表那些根據(jù)類創(chuàng)建的對(duì)象。

(d)對(duì)象可以通過(guò)多種方式加以操作。

考點(diǎn):考察求職者對(duì)Java開(kāi)發(fā)原則的理解。

出現(xiàn)頻率:★★★

面試題解析Java開(kāi)發(fā)一般遵循以下幾個(gè)原則:

? Java中的代碼必須封裝到類中。

? Java中有兩種值:對(duì)象的引用和元數(shù)據(jù)類型值。

? 引用代表根據(jù)類創(chuàng)建的對(duì)象。

? 對(duì)象只能通過(guò)引用加以操作。

? Java中的對(duì)象不能包含其他對(duì)象,對(duì)象只能擁有指向其他對(duì)象的引用。

參考答案:(a)、(c)。

主站蜘蛛池模板: 民乐县| 赤城县| 邢台县| 渑池县| 文登市| 林周县| 泰和县| 枞阳县| 丹东市| 广元市| 新源县| 古交市| 中方县| 山东省| 潜江市| 青州市| 陇西县| 汽车| 澄江县| 玉山县| 务川| 璧山县| 普陀区| 文山县| 江山市| 英超| 天峨县| 嘉峪关市| 成安县| 连州市| 彭阳县| 茶陵县| 银川市| 漾濞| 老河口市| 读书| 河曲县| 金溪县| 沙坪坝区| 张掖市| 象山县|