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

第2章 Java語言基礎(chǔ)

在用人單位的面試中,Java語言基礎(chǔ)知識是考察的重點之一,也是一個合格Java程序員必須掌握的知識。一個對于Java語言基礎(chǔ)知識一知半解的程序員,會在實際的項目開發(fā)工作中犯一些低級錯誤,對項目開發(fā)的質(zhì)量和團(tuán)隊的開發(fā)進(jìn)度都有很大的影響。代碼的質(zhì)量,直接影響了軟件工程的質(zhì)量。

Java語言基礎(chǔ)主要涉及以下幾個方面。

? Java的基本語言元素。

? 原始數(shù)據(jù)類型。

? 變量聲明。

? 變量的初始化。

? Java源文件的結(jié)構(gòu)。

? main()方法。

面試題1 掌握J(rèn)ava標(biāo)識符

請標(biāo)記出下面代碼中的錯誤。

        public class JavaSign {
              public int 48abc=20;
              private int Num=100;
              private int m-48abc;
              private int m_abc=30;
              private int number=60;
              private String $hk;
              private double ¥money;
              public  String我的變量="我是一個兵!";
              private String my@email="helloworld";

              public static void main(String[] args) {
                  System.out.println(num);
                  System.out.println(my@email);
                  System.out.println(48abc+m_abc);
                  System.out.println(number);
              }
        }

考點:這是一個比較有代表性的面試題,考察求職者Java語言基礎(chǔ)的基本功,重點考察求職者對Java標(biāo)識符的掌握。

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

面試題解析】標(biāo)識符是一個語言的基本元素,在Java開發(fā)語言中,標(biāo)識符可以用來表示類、方法、變量和標(biāo)簽。標(biāo)識符是由一系列的字符組成,每個字符可以是字母、數(shù)字、連接符號(例如_)或者任意的貨幣符(如$、¥等)。

求職者必須要注意的是,Java標(biāo)識符的第1個字母不能為數(shù)字,Java語言是區(qū)分字母大小寫的,Num和num是兩個毫不相干的標(biāo)識。

注意:Java使用的是Unicode編碼。Unicode中每個字符都對應(yīng)了一個唯一的數(shù)字,而不論是什么平臺、使用什么語言、編寫什么程序。Unicode標(biāo)準(zhǔn)已經(jīng)被當(dāng)今工業(yè)界的領(lǐng)導(dǎo)們所采用,例如Apple、HP、IBM、JustSystem、Microsoft、Oracle、SAP、Sun、Sybase、Unisys和其他許多公司。最新的標(biāo)準(zhǔn)例如XML、Java、ECMAScript(JavaScript)、LDAP、CORBA 2.0、WML等,以及許多操作系統(tǒng)、所有最新的瀏覽器和許多其他產(chǎn)品都支持。Unicode標(biāo)準(zhǔn)的出現(xiàn)和支持它的工具存在,是近來全球軟件技術(shù)最重要的發(fā)展趨勢。

基本上,計算機(jī)只是處理數(shù)字,輸入或輸出的字母或其他字符都被編碼為一個數(shù)字。在創(chuàng)造Unicode之前,有數(shù)百種指定這些數(shù)字的編碼系統(tǒng),沒有一個編碼可以包含足夠的字符。例如,歐州共同體就需要好幾種不同的編碼系統(tǒng)來包括所有的語言。即使是單一種語言,例如英語,也沒有哪一個編碼可以適用于所有的字母、標(biāo)點符號和常用的技術(shù)符號。不同編碼系統(tǒng)也會互相沖突。也就是說,兩種編碼可能使用相同的數(shù)字代表兩個不同的字符,或使用不同的數(shù)字代表相同的字符。因此任何一臺特定的計算機(jī)(特別是服務(wù)器)都需要支持許多不同的編碼,而且不論什么時候數(shù)據(jù)通過不同的編碼或平臺之間,數(shù)據(jù)總會存在損壞的風(fēng)險。

例如,在簡體中文(GB)、繁體中文(BIG5)、日文中,“趙”都是同一個字,但是編碼方式不同。BIG5的趙對應(yīng)0xBBAF,而0xBBAF在GB里面就被顯示為“化”,這就是我們常見的亂碼的原因之一。Unicode采用統(tǒng)一的編碼,“趙”只對應(yīng)一個數(shù)字,不必管它來自哪種語系。

下面舉例來說明如何區(qū)分正確和錯誤的標(biāo)識符。

正確的Java標(biāo)識符示例:

Abc123、abc、¥m、$kill、my_code、gач

非法的Java標(biāo)識符:

46m、my@email、 int-1

面試題中,求職者容易忽略一點,中文變量和中文字符是合法的。

參考答案:

        public class JavaSign {
              // 錯誤:Java的標(biāo)識符不能以數(shù)字開頭
              public int 48abc=20;
              private int Num=100;
              // 錯誤:Java的標(biāo)識符不能包含-,只能在表達(dá)式中使用
              private int m-48abc;
              private int m_abc=30;
              private String $hk;
              private double ¥money;
              public  String我的變量="我是一個兵!";
              private int number=60;
              // 錯誤:不能在變量中使用@,為不合法標(biāo)識符
              private String my@email="helloworld";

              public static void main(String[] args) {
                  // 錯誤:沒有定義num變量,因為Java是區(qū)分大小寫的
                  System.out.println(num);
                  // my@email定義錯誤
                  System.out.println(my@email);
                  // 48abc定義錯誤
                  System.out.println(48abc+m_abc);
                  // 錯誤:不能在靜態(tài)方法中引用一個非靜態(tài)變量
                  System.out.println(number);
                  }
        }

面試題2 掌握J(rèn)ava關(guān)鍵字

編譯、運行如下代碼,請選擇正確的一項描述。

        public class JavaKey {
              private int java=100;//(1)
              public String True="my Java";//(2)
              public static void main(String[] args) {
                  int ingeter=20;(3)
                  JavaKey key=new JavaKey(); //(4)
                  System.out.println(key.java);//(5)
              }
        }

(a)編譯成功,打印100。

(b)編譯不通過,提示(1)處有錯誤。

(c)編譯不通過,提示(2)處有錯誤。

(d)編譯不通過,提示(3)處有錯誤。

(e)編譯不通過,提示(4)、(5)處有錯誤。

考點:主要考察求職者對于Java關(guān)鍵字的掌握,一般都會在面試題中出現(xiàn)開發(fā)中容易出現(xiàn)的混淆關(guān)鍵字。

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

面試題解析】Java語言中的關(guān)鍵字是開發(fā)語言中預(yù)定義的保留標(biāo)識符,不能在程序代碼中表示類、變量、方法等成員。Java的關(guān)鍵字有如下特征。

? Java的關(guān)鍵字都是小寫的。

? then和sizeof都不是Java的關(guān)鍵字。熟悉C或者C++,寫慣了ASP的程序員一定要注意。

? 大寫的NULL不是java語言的關(guān)鍵字。String是Java語言的一個封裝類的類名,也不是關(guān)鍵字。

下面給出Java語言的關(guān)鍵字,如表2.1所示。

表2.1 Java語言的關(guān)鍵字

Java語言中的保留字:null、true和false。

Java語言中保留但是未使用的關(guān)鍵字:const和goto。

參考答案:(a)。

面試題3 找出Java關(guān)鍵字

Which of the following are keyWords or reserved words in Java?(下面哪些是Java語言的關(guān)鍵字或者是保留字?)

(a)if

(b)then

(c)goto

(d)while

(e)case

(f)sizeof

考點:主要考察求職者對于Java關(guān)鍵字的掌握。

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

面試題解析】請參考Java關(guān)鍵字表。

參考答案:(a)(c)(d)(e)。

面試題4 挑選Java關(guān)鍵字

Which of these are key words in java?(下面哪些是Java關(guān)鍵字?)

(a)default

(b)NULL

(c)String

(d)throws

(e)long

(f)true

考點:主要考察求職者對于Java關(guān)鍵字的掌握。

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

【面試題解析】請參考Java關(guān)鍵字表。

參考答案:(a)、(d)、(e)、(f)。

面試題5 選擇完整合法的Java注釋

下面是否為一條完整而且合法的Java注釋?

        /*//*/

(a)不是,塊狀注釋(/*…*/)尚未閉合,因為這里單行注釋(//…)注釋掉了塊狀注釋的閉合部分。

(b)這是一個完全有效的注釋。編譯器會忽略//部分。

(c)是一個非法注釋,編譯器會報錯。

考點:考察求職者對Java注釋的熟悉程度。在軟件項目開發(fā)中,規(guī)范而且完整的注釋可以提高代碼的可讀性和可維護(hù)性。

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

【面試題解析】Java語言提供了3種用于程序的注釋。

? 單行注釋://…到行尾。

? 多行注釋:/*…*/。

? 歸檔(Javadoc)注釋:/**…*/。

多行注釋可以跨越多行,以/*開頭,*/結(jié)尾,例如:

        /* a mothed
        Test
        Hello
        */

注意:如果多行注釋內(nèi)容出現(xiàn)注釋起始符號,例如//、/*、//*等,編譯器視為普通字符,并不做任何處理。但是多行注釋不能嵌套,如下注釋會引發(fā)錯誤:

        /* hello
        Test
        /*  a sub */
        */

注釋在軟件開發(fā)中的使用。

1.文件頭注釋

文件頭注釋以 /*開始,以*/結(jié)束,需要注明該文件的創(chuàng)建時間、文件名、命名空間信息。

例如:

        /*
        * Created on 2005-7-2
        * File  Test.java
        * Package  com.cn
        * Create Date:2008-08-01
        * /

2.類、接口注釋

類、接口的注釋采用 /** … */,描述部分用來書寫該類的作用或者相關(guān)信息,塊標(biāo)記部分必須注明作者和版本。注釋代碼示例如下:

        /**Title: XXXX DRIVER 2.0
        *Description: XXXX DRIVER 2.0
        *Copyright: Copyright (c) 2003
        *Company:XXXX有限公司
        *
        * @author Java Development Group
        * @version 2.0
        */

如下示例也很常見:

        /**
        * A class representing a window on the screen.
        * For example:
        *
        * Window win = new Window(parent);
        * win.show();
        *
        *
        * @author Sami Shaio
        * @version %I%, %G%
        * @see java.awt.BaseWindow
        * @see java.awt.Button
        */
        class Window extends BaseWindow {
        ...
        }

3.構(gòu)造函數(shù)注釋

構(gòu)造函數(shù)注釋采用 /** … */,描述部分注明構(gòu)造函數(shù)的作用,不一定有塊標(biāo)記部分。

無塊標(biāo)記的示例如下:

        /**
        * 默認(rèn)構(gòu)造函數(shù)
        */

帶塊標(biāo)記的示例如下:

        /**
        * 帶參數(shù)構(gòu)造函數(shù),初始化模式名、變量名稱和數(shù)據(jù)源類型
        * @param schema
        * Ref模式名
        * @param name
        * Ref變量名稱
        * @param type
        * byVal數(shù)據(jù)源類型
        */

4.域注釋

域注釋可以出現(xiàn)在注釋文檔里面,也可以不出現(xiàn)在注釋文檔里面。用/** … */的域注釋將會被認(rèn)為是注釋文檔而出現(xiàn)在最終生成的HTML報告里面(Javadoc),而使用/* … */的注釋則會被忽略。例如:

        /**
        * @作者 閆術(shù)卓
        * @創(chuàng)建時間Sep 1, 2008 2:10:30 PM
        */

上面的域注釋會生成下面的HTML報告:

        @作者
        閆術(shù)卓
        @創(chuàng)建時間
        Sep 1, 2008 2:10:30 PM

5.方法注釋

方法注釋采用 /** … */,描述部分注明方法的功能,塊標(biāo)記部分注明方法的參數(shù),返回值、異常等信息。例如:

        /**
        * 設(shè)置是否有外碼約束
        *
        * @param conn
        * Connection與數(shù)據(jù)庫的連接
        */

注意:初級程序員容易忽略Java代碼的注釋,而往往只關(guān)注代碼的實現(xiàn)邏輯,高級程序員更加注重代碼的規(guī)范性和可讀性。

參考答案:(b)。

面試題6 int和Integer的區(qū)別是什么

考點:考察求職者對引用類型和原始類型的區(qū)分和理解。

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

面試題解析】Java提供引用類型和原始類型(或內(nèi)置類型)兩種不同的類型。另外,Java還為每個原始類型提供了封裝類(Wrapper)。

表2.2列出了原始類型以及對應(yīng)的對象封裝類。

表2.2 原始類型和對應(yīng)的封裝類

引用類型和原始類型的行為完全不同,并且分別具有不同的語義。假定一個方法中有兩個局部變量,一個變量為int原始類型,另一個變量是對一個Integer對象的對象引用,如下所示:

        int i = 5;                             // 原始類型
        Integer j = new Integer(10);          // 對象引用

這兩個變量都存儲在局部變量表中,并且都是在Java操作數(shù)堆棧中被操作的。原始類型int和對象引用各占堆棧的32位(要表示一個int或一個對象引用,Java虛擬機(jī)實現(xiàn)至少需要使用32 位存儲)。Integer對象對應(yīng)的堆棧項并不是對象本身,而是一個對象引用。對象引用是指向?qū)ο蟠鎯λ诙阎械哪硞€區(qū)域的指針。Java中的所有對象都要通過對象引用訪問。而當(dāng)聲明一個原始類型時,就為類型本身聲明了存儲。

引用類型和原始類型具有不同的特征和用法。以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,決定了以此類型作為某個類的實例數(shù)據(jù)時所指定的默認(rèn)值。對象引用實例變量的默認(rèn)值為null,而原始類型實例變量的默認(rèn)值與具體的類型有關(guān)。

許多程序的代碼將同時包含原始類型以及它們的對象封裝。程序員必須了解這兩種類型是如何工作和相互作用的,以避免代碼出錯。

例如,不能對原始類型調(diào)用方法,但可以對對象調(diào)用方法。

        int j = 5;
        j.hashCode();     // 錯誤
        //...
        Integer i = new Integer(5);
        i.hashCode();     // 正確

使用原始類型無須調(diào)用new,也無須創(chuàng)建對象,這節(jié)省了時間和空間。混合使用原始類型和對象,也可能導(dǎo)致與賦值有關(guān)的意外結(jié)果,看起來沒有錯誤的代碼,可能無法完成預(yù)期工作。示例代碼如下:

        import java.awt.Point;
        class Assign
        {
        public static void main(String args[])
        {
        int a = 1;
        int b = 2;
        Point x = new Point(0,0);
        Point y = new Point(1,1);                 // 1
        System.out.println("a is " + a);
        System.out.println("b is " + b);
        System.out.println("x is " + x);
        System.out.println("y is " + y);
        System.out.println("Performing assignment and " + "setLocation...");
        a = b;
        a++;
        x = y;                                 // 2
        x.setLocation(5,5);                     // 3
        System.out.println("a is "+a);
        System.out.println("b is "+b);
        System.out.println("x is "+x);
        System.out.println("y is "+y);
        }
        }

這段代碼生成以下輸出:

        a is 1
        b is 2
        x is java.awt.Point[x=0,y=0]
        y is java.awt.Point[x=1,y=1]
        Performing assignment and setLocation...
        a is 3
        b is 2
        x is java.awt.Point[x=5,y=5]
        y is java.awt.Point[x=5,y=5]

修改整數(shù)ab后結(jié)果沒意外。b的值被賦予整型變量aa值增加了1。令人感到意外是在賦值并調(diào)用setLocation()函數(shù)之后,x和y對象的輸出結(jié)果。我們在完成x=y賦值之后,特意對x調(diào)用了setLocation,xy的值怎么會相同呢?將y賦予x,然后更改了x,這與我們對整數(shù)ab進(jìn)行的操作沒什么不同。

這種混淆是由原始類型和對象的使用造成的。賦值對這兩種類型所起的作用沒什么不同。賦值運算符“=”左邊的值等于右邊的值,這一點對于原始類型(如前面的int類型值ab)是顯而易見的。對于非原始類型(如Point對象),賦值修改的是對象引用,而不是對象本身。

換句話說,xy是對象引用,因此,在語句“x=y;”之后,xy引用同一個對象,對x執(zhí)行的所有方法與對y執(zhí)行的方法都作用于同一個對象。

面試題7 哪些不屬于Java的原始類型

請選擇兩個答案。

(a)"abc"

(b)'x'

(c)100.09F

(d)"hello"

(e)false

考點:考察求職者對Java原始類型的掌握。

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

面試題解析】應(yīng)該記住Java語言的8個原始類型:boolean、char、byte、short、int、long、float和double。

參考答案:

(a)、(d)。其他都是原始類型,而(a)、(d)是字符串,即一個String對象類型。

面試題8 String和StringBuffer的區(qū)別

考點:考察求職者對常用的字符串處理對象的掌握。

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

參考答案:

Java提供了兩個字符串類:String和StringBuffer。它們可以儲存和操作字符串,即包含多個字符的字符串?dāng)?shù)據(jù)。字符串String類提供了數(shù)值不可改變的字符串,而StringBuffer類提供的字符串對象可以進(jìn)行修改。當(dāng)知道字符數(shù)據(jù)要改變的時候,就可以使用StringBuffer類創(chuàng)建,典型地,可以使用StringBuffers來動態(tài)構(gòu)造字符數(shù)據(jù)。

面試題9 指出Java的原始數(shù)據(jù)類型并說出其分類

考點:考察求職者對Java原始數(shù)據(jù)類型的掌握。

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

面試題解析】Java的原始數(shù)據(jù)類型可以分為以下幾種。

1.基本的整數(shù)類型

整數(shù)是從負(fù)無窮到正無窮之間的任意整型的數(shù)據(jù),例如5、0、-128。因為計算機(jī)資源有限,并且需要存儲器來存儲變量,所以必須要靈活地定義數(shù)量。Java中有4 種已定義的整數(shù)類型:byte、short、int和long。每種類型以及它們的存儲空間需求和取值范圍,如表2.3所示。

整數(shù)類型的取值范圍由各自的存儲大小決定。例如,int類型需要32位,這使得一個int變量有232=4294967296個不同的取值。由于所有的Java變量都是有符號的(意思是它們必須隱性地傳送正或負(fù)的值),有效范圍變?yōu)?231(-2147483648)~231-1(2147483647)。Int類型變量的最大值是2147483647而不是2147483648,這是由于0作為一個有效值被包含進(jìn)來了。

表2.3 整數(shù)類型范圍

2.浮點類型

有時整型數(shù)據(jù)不夠用,一些在數(shù)學(xué)和物理中使用的值通常用十進(jìn)制小數(shù)表示。Java和C++一樣,支持兩種小數(shù)類型:float和double。表2.4給出了它們的存儲方式和有效范圍。

聲明浮點變量的示例如下:

        double pi = 2.141592653589793d;
        float velocity = 30.65f;
        double gravity = 9.81;

注意,聲明一個float類型的值,必須以f(或F)作為后綴;否則,會被當(dāng)作double類型。對于double值來說,d(或D)后綴是可選的。

表2.4 浮點類型范圍

雙精度數(shù)在本質(zhì)上給出了相對于浮點數(shù)兩倍的精度,但是,這是有代價的——通常是內(nèi)存的消耗。在Java API中,大部分的方法返回類型和數(shù)據(jù)成員時使用double型。這在實際開發(fā)中值得注意。

3.Char類型

Java中一個字符(用char表達(dá))表示Unicode字符集中的一個元素。Unicode字符由16位組成,因此,有65536個不同的字符可用,這與C++的標(biāo)準(zhǔn)128個ASCII字符不同。Unicode字符集提供了很大的靈活性,它能包含所有不同語言的字符以及常用符號。

字符由單引號括起來的單個字符表達(dá),通常以16進(jìn)制表示,范圍為'\u0000'~'\uFFFF '(' u '告訴編譯器用戶在用兩個字節(jié)字符信息表示一個Unicode字符)。正確使用字符的示例如下:

        char letter;
        char lastInitial = 'R';

注意:與C++中不同,Java中一個字符數(shù)組沒有必要組成一個字符串。Java API定義了自己的String類型。一般只有敏感信息,如密碼字段,才會作為字符數(shù)組處理。這是因為,Java對象在沒有被Java虛擬機(jī)作為不被引用的對象清空之前一直駐留在內(nèi)存中,把敏感數(shù)據(jù)留在內(nèi)存中可能會造成危險的局面。

4.布爾型

布爾型(以19世紀(jì)的數(shù)學(xué)家George Boole的名字命名)給了程序員為變量設(shè)置真值的能力。很多語言雖然使用boolean變量,但不把它看作一種獨立的數(shù)據(jù)類型。在Java中,任何一個boolean變量只有兩個有效值:true和false。boolean型沒有等價的數(shù)值賦值,也不允許類型轉(zhuǎn)換。還有,注意所有的if和while聲明都相當(dāng)于一個boolean結(jié)果。正確使用boolean型示例如下:

        boolean isAlive = true;
        while(isAlive)
        {
            // 程序代碼
        }

參考答案:

Java的原始數(shù)據(jù)類型可以分為4類,如下所述。

? 整型:byte、short、int和long。

? 浮點型:float和double。

? Char型:char。

? 布爾型:boolean。

面試題10 理解和掌握J(rèn)ava語言中的變量初始化

編譯并運行下面代碼,請選擇正確的一項。

        public class TestVariableInit {
              public static void main(String[] args) {
                  TestClass tc = new TestClass();
                  int j;
                  System.out.println("tc.iStr = " + tc.iStr);
                  System.out.println("tc.i =" + tc.i);
                  System.out.println("j =" + j);
              }
        }

        class TestClass {
              int i;
              String iStr;
        }

(a)編譯通過,輸出:

        tc.iStr = null
        tc.i =0
        j =0

(b)編譯通過,輸出:

        tc.iStr =
        tc.i =0
        j =0

(c)編譯錯誤,提示j未初始化。

考點:考察求職者對Java語言中的變量初始化的理解和掌握,特別是考察求職者對于對象變量的初始值null的理解。筆者在開發(fā)項目時,對這個問題深有體會,在項目試用階段頻繁產(chǎn)生錯誤,耗費了很多精力才找到癥結(jié),發(fā)現(xiàn)竟然是一個小小的null引發(fā)的。

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

面試題解析】Java語言中,變量存放著某一個具體類型的值,一般變量對應(yīng)著一個名稱標(biāo)識符、指向一個類型和一個與之關(guān)聯(lián)的值。Java變量的值有兩種,一種是原始數(shù)據(jù)類型,另外一種是指向?qū)ο蟮囊茫鐖D2.1所示。

圖2.1 Java的變量類型示意圖

在Java(TM) 編程語言中,變量的初始化依靠于其所在的上下文。請看下面代碼:

        int x;
        Dog fido;

假如x和fido都是實例變量,它們就分別被自動初始化為0和null。null是一個非凡的字面值,它能賦值給任何引用變量。一般說來,假如實例變量在定義的時候沒有被顯式地初始化,那么Java將變量自動初始化為“似零”的值,具體值由變量的數(shù)據(jù)類型決定,如表2.5所示。

表2.5 Java變量的默認(rèn)初始化值

請參考如下代碼:

        public class TestVariableInit {
        public static void main(String[] args) {
              TestClass tc = new TestClass();
              //打印出變量的初始化值
              System.out.println("tc.iStr = " + tc.iStr);
              System.out.println("tc.i = " + tc.i);
        }
        }
        class TestClass {
        int i; // 初始化變量
        String iStr; // 初始化變量
        }

TestVariableInit運行后輸出如下結(jié)果:

        D:\>java TestVariableInit
        tc.iStr = null
        tc.i = 0

這種變量的默認(rèn)初始化并不是在所有的情況下都適用,例如,一個局部變量(在方法體內(nèi)聲明的變量)假如沒有顯式初始化,根據(jù)所在Java環(huán)境不同,編譯器會給出一個警告或者是報出一個錯誤。

實際情況是,以前有些Java環(huán)境對局部變量不提供初始化,也不給出警告或者錯誤。在這種情況下,值是垃圾,可能造成非常難于診斷的運行錯誤。

Oracle公司發(fā)布的Java開發(fā)包(JDK)中,編譯器將在未初始化的局部變量的引用位置處報錯。假如我們將TestVariableInit中的main()方法修改入下:

        public static void main(String[] args) {
        TestClass tc = new TestClass();
        String lStr; // 局部變量
        int i; //局部變量
        System.out.println("tc.iStr = " + tc.iStr);
        System.out.println("tc.i = " + tc.i);
        System.out.println("lStr = " + lStr);
        System.out.println("i = " + i);
        }

試圖編譯TestVariableInit會產(chǎn)生下面的輸出:

        D:\>javac TestVariableInit.java
        TestVariableInit.java:8: Variable lStr may not have been initialized.
        System.out.println("lStr = " + lStr);
        TestVariableInit.java:9: Variable i may not have been initialized.
        System.out.println("i = " + i);
        ^
        2 errors

對于此類情況,Java環(huán)境保證給出一個默認(rèn)值,但是不答應(yīng)開發(fā)者使用它,這有些不可思議。大部分的程序員都贊成為了可讀性更好,實例變量應(yīng)該初始化,并且局部變量必須初始化,這樣不管在哪種Java環(huán)境中,源代碼都可以被編譯,而不必關(guān)心源代碼的編寫者是誰。

注意:對象的默認(rèn)初始值為null,但是系統(tǒng)并沒有創(chuàng)建一個相對應(yīng)的對象,只是創(chuàng)建了一個可以存儲對象引用的變量。這是Java程序員在軟件開發(fā)中遇到的最常見的一個錯誤。令人惱火的是,這些錯誤只有在運行的時候才會出現(xiàn)。在一個大型軟件項目的開發(fā)中,由于這個小小的錯誤導(dǎo)致大問題屢見不鮮。

例如,變量聲明如下:

        String str;

由于str是一個String類型的變量,系統(tǒng)會自動分配一個存儲單元,用來存放String對象的引用,但是并沒有創(chuàng)建一個String對象。代碼如下:

        public class TestVariableInit {
              public static void main(String[] args) {
                  TestClass tc = new TestClass();
                  //千萬注意,這里并沒有編譯錯誤,會產(chǎn)生運行時錯誤!
                  System.out.println("tc.i =" + tc.iStr.length());
              }
        }

        class TestClass {
              int i;
              String iStr;
        }

使用javac命令編譯的時候是沒有任何錯誤提示的,但是在運行該程序時,會返回一個空指針錯誤:

        Exception in thread "main" java.lang.NullPointerException
            at TestVariableInit.main(TestVariableInit.java:10)

從這個示例可以看出,iStr的值為null,但不是一個String對象,所以tc.iStr.length()是錯誤的。

面試題11 哪幾個是有效的聲明語句

(a)char a='\u0061';

(b)char 'a'= 'a';

(c)char \u0061= 'a ';

(d)ch\u0061r a= 'a ';

(e)ch'a'r a='a';

考點:考察求職者對Java語言的變量聲明和轉(zhuǎn)義符的認(rèn)識。

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

面試題解析】在Java源代碼中,可以使用Unicode值來表示字符型字,一般形式為\uxxxx,Java編譯器會將這些Unicode值轉(zhuǎn)換為字符來處理。

例如:

        char  \u0061='a ';

編譯器會將其翻譯為:

        char  a= 'a ';

表2.6給出了常見的Java轉(zhuǎn)義符。

表2.6 Java常用的轉(zhuǎn)義符

注意:在Java源代碼中,不能使用\u000a和\u000d來替代換行和回車,這樣編譯器會將這些值解釋為終止符,導(dǎo)致編譯錯誤。

面試題解析】參考前面介紹。

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

面試題12 選擇正確的代碼運行結(jié)果

編譯運行下面代碼,正確的運行結(jié)果是?

        public class TestVariableInit {
            char \u0061='a';
              String s="\u0061";
              public static void main(String[] args) {
                  TestVariableInit tc = new TestVariableInit();
                  System.out.println(tc.a);
                  System.out.println(tc.s);
              }
        }

(a)編譯錯誤;

(b)輸出:a a;

(c)輸出:a \u0061;

(d)編譯正常,運行出現(xiàn)錯誤。

考點:考察求職者對Java語言的變量聲明和轉(zhuǎn)義符的認(rèn)識。

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

參考答案:(b)。

面試題13 空文件是否為一個有效的Java程序源文件

考點:考察求職者對Java源文件結(jié)構(gòu)的理解。

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

面試題解析】Java程序員最基本的知識之一就是掌握J(rèn)ava源文件的結(jié)構(gòu)。Java源文件可以包括如下幾個結(jié)構(gòu):

? package包;

? import內(nèi)容;

? 類型聲明。

其中,package用來制定該文件所處的包的名稱,必須位于源文件頂端;import用來指定所引入的一個或者多個包;類型聲明是任意的頂層類聲明和接口的聲明。

類和接口的定義次序是任意的,二者合起來稱為類型聲明。實際上,源文件可以不需要任何這樣的定義。Java SDK要求一個源文件中最多只能定義一個公共類,同時該源文件的文件名必須同該類相同。例如,某個公共類名稱為Hello,那么源文件名稱必須為Hello.java。

參考答案:是。

面試題14 嘗試編譯代碼并判斷結(jié)果

編譯下面的代碼,檢查結(jié)果。

        import java.util.*;
        package com.dir;
        public Hello{
        ……
        }
        Class Other{
        ……
        }

請選擇一個正確的答案。

(a)編譯錯誤,類Hello和Other不能出現(xiàn)在一個源文件中。

(b)編譯正確。

(c)編譯錯誤,因為import不能位于源文件的頂端。

(d)編譯錯誤,因為package必須在import之前。

(e)編譯錯誤,因為Hello不能聲明為公共的。

面試題解析】從前面的講解來看,明顯的答案是(d),因為Java源文件的包聲明必須在頂端。

參考答案:(d)。

面試題15 關(guān)于main()方法正確的描述是

(a)static void main(String[] args)。

(b)public static int main(String[] args)。

(c)public static void main(String args)。

(d)final static void main(String[] args)。

(e)public int main(String[] args,int argc)。

(f)static public void main(String[] args)。

考點:考察求職者對于Java源文件中的main()方法的掌握。

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

面試題解析】在Java中,main()方法是Java應(yīng)用程序的入口方法,也就是說,程序在運行的時候,第1個執(zhí)行的方法就是main()方法。這個方法和其他的方法有很大的不同。方法的名字必須是main,方法必須是public static void類型的,方法必須接收一個字符串?dāng)?shù)組的參數(shù)等。

通過一個最簡單的Java應(yīng)用程序HelloWorld,來說明Java類中main()方法,程序的代碼如下:

        /**
        * Created by IntelliJ IDEA.
        * Date: 2013-08-03
        * Time: 8:46:50
        * Java中的main()方法詳解
        */
        public class HelloWorld {
        public static void main(String args[]) {
        System.out.println("Hello World!");
        }
        }

1.類

HelloWorld類中有main()方法,說明這是個Java應(yīng)用程序,通過JVM直接啟動運行的程序。既然是類,java允許類不加public關(guān)鍵字約束,當(dāng)然類的定義只能限制為public或者無限制關(guān)鍵字(默認(rèn)的)。

2.main()方法

這個main()方法的聲明為:public static void main(String args[])。必須這么定義,這是Java的規(guī)范,和JVM的運行有關(guān)系。

當(dāng)一個類中有main()方法,執(zhí)行命令“java類名”,則會啟動JVM執(zhí)行該類中的main()方法。由于JVM在運行這個Java應(yīng)用程序的時候,首先會調(diào)用main()方法,調(diào)用時不實例化這個類的對象,而是通過類名直接調(diào)用,因此需要是限制為公共(public)和靜態(tài)(static)的。對于Java中的main()方法,JVM有限制,不能有返回值,因此返回值類型為void。

main()方法中需要一個輸入?yún)?shù),類型為String[],這個也是Java的規(guī)范,至于字符串?dāng)?shù)組的名字,是可以自己設(shè)定的。根據(jù)習(xí)慣,這個字符串?dāng)?shù)組的名字一般和Java規(guī)范范例中mian()方法的參數(shù)名保持一致(args)。

3.main()方法不能拋出異常

main()方法中的異常要么處理,要么不處理,不能繼續(xù)拋出。public static int main(String args[]) throws Exception來定義main()方法是錯誤的。

4.main()方法中字符串參數(shù)數(shù)組作用

main()方法中字符串參數(shù)數(shù)組作用是接收命令行輸入?yún)?shù)的,命令行的參數(shù)之間用空格隔開。下面給出一個例子,看看如何初始化和使用這個數(shù)組。

        /**
        * Created by IntelliJ IDEA.
        * Date: 2013-08-03
        * Time: 10:22:15
        * 打印main()方法中的輸入?yún)?shù)
        */
        public class TestMain {
        public static void main(String args[]){
        System.out.println("打印main()方法中的輸入?yún)?shù)!");
        for(int i=0;i
        System.out.println(args[i]);
        }
        }
        }

執(zhí)行方法和運行結(jié)果如下:

        D:\Study\basetest\src>javac TestMain.java
        D:\Study\basetest\src>java TestMain 1 2 3
        打印main()方法中的輸入?yún)?shù)!
        1
        2
        3

注意:main()方法作為一個特殊的規(guī)范,與普通的方法有很大區(qū)別,限制很多,理解其原理需要學(xué)習(xí)JVM相關(guān)知識。這是Java學(xué)習(xí)中大的障礙。

參考答案:(d)、(f)。

主站蜘蛛池模板: 牙克石市| 密云县| 陕西省| 乐都县| 竹溪县| 唐河县| 芜湖县| 古浪县| 广安市| 太仆寺旗| 德保县| 杭锦后旗| 禄丰县| 尤溪县| 辽宁省| 长春市| 峨眉山市| 富阳市| 巫溪县| 青龙| 南康市| 铁岭县| 沙洋县| 基隆市| 古蔺县| 永修县| 手机| 平原县| 炎陵县| 安泽县| 萍乡市| 涡阳县| 文成县| 彩票| 和田市| 会宁县| 本溪市| 左云县| 通辽市| 黄梅县| 桑植县|