- Java程序員面試秘笈
- 陳浩編著
- 129字
- 2019-01-02 07:03:49
第2章 Java語言基礎
在用人單位的面試中,Java語言基礎知識是考察的重點之一,也是一個合格Java程序員必須掌握的知識。一個對于Java語言基礎知識一知半解的程序員,會在實際的項目開發工作中犯一些低級錯誤,對項目開發的質量和團隊的開發進度都有很大的影響。代碼的質量,直接影響了軟件工程的質量。
Java語言基礎主要涉及以下幾個方面。
? Java的基本語言元素。
? 原始數據類型。
? 變量聲明。
? 變量的初始化。
? Java源文件的結構。
? main()方法。
面試題1 掌握Java標識符
請標記出下面代碼中的錯誤。
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語言基礎的基本功,重點考察求職者對Java標識符的掌握。
出現頻率:★★★★★
【面試題解析】標識符是一個語言的基本元素,在Java開發語言中,標識符可以用來表示類、方法、變量和標簽。標識符是由一系列的字符組成,每個字符可以是字母、數字、連接符號(例如_)或者任意的貨幣符(如$、¥等)。
求職者必須要注意的是,Java標識符的第1個字母不能為數字,Java語言是區分字母大小寫的,Num和num是兩個毫不相干的標識。
注意:Java使用的是Unicode編碼。Unicode中每個字符都對應了一個唯一的數字,而不論是什么平臺、使用什么語言、編寫什么程序。Unicode標準已經被當今工業界的領導們所采用,例如Apple、HP、IBM、JustSystem、Microsoft、Oracle、SAP、Sun、Sybase、Unisys和其他許多公司。最新的標準例如XML、Java、ECMAScript(JavaScript)、LDAP、CORBA 2.0、WML等,以及許多操作系統、所有最新的瀏覽器和許多其他產品都支持。Unicode標準的出現和支持它的工具存在,是近來全球軟件技術最重要的發展趨勢。
基本上,計算機只是處理數字,輸入或輸出的字母或其他字符都被編碼為一個數字。在創造Unicode之前,有數百種指定這些數字的編碼系統,沒有一個編碼可以包含足夠的字符。例如,歐州共同體就需要好幾種不同的編碼系統來包括所有的語言。即使是單一種語言,例如英語,也沒有哪一個編碼可以適用于所有的字母、標點符號和常用的技術符號。不同編碼系統也會互相沖突。也就是說,兩種編碼可能使用相同的數字代表兩個不同的字符,或使用不同的數字代表相同的字符。因此任何一臺特定的計算機(特別是服務器)都需要支持許多不同的編碼,而且不論什么時候數據通過不同的編碼或平臺之間,數據總會存在損壞的風險。
例如,在簡體中文(GB)、繁體中文(BIG5)、日文中,“趙”都是同一個字,但是編碼方式不同。BIG5的趙對應0xBBAF,而0xBBAF在GB里面就被顯示為“化”,這就是我們常見的亂碼的原因之一。Unicode采用統一的編碼,“趙”只對應一個數字,不必管它來自哪種語系。
下面舉例來說明如何區分正確和錯誤的標識符。
正確的Java標識符示例:
Abc123、abc、¥m、$kill、my_code、gач
非法的Java標識符:
46m、my@email、 int-1
面試題中,求職者容易忽略一點,中文變量和中文字符是合法的。
參考答案:
public class JavaSign { // 錯誤:Java的標識符不能以數字開頭 public int 48abc=20; private int Num=100; // 錯誤:Java的標識符不能包含-,只能在表達式中使用 private int m-48abc; private int m_abc=30; private String $hk; private double ¥money; public String我的變量="我是一個兵!"; private int number=60; // 錯誤:不能在變量中使用@,為不合法標識符 private String my@email="helloworld"; public static void main(String[] args) { // 錯誤:沒有定義num變量,因為Java是區分大小寫的 System.out.println(num); // my@email定義錯誤 System.out.println(my@email); // 48abc定義錯誤 System.out.println(48abc+m_abc); // 錯誤:不能在靜態方法中引用一個非靜態變量 System.out.println(number); } }
面試題2 掌握Java關鍵字
編譯、運行如下代碼,請選擇正確的一項描述。
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關鍵字的掌握,一般都會在面試題中出現開發中容易出現的混淆關鍵字。
出現頻率:★★★★
【面試題解析】Java語言中的關鍵字是開發語言中預定義的保留標識符,不能在程序代碼中表示類、變量、方法等成員。Java的關鍵字有如下特征。
? Java的關鍵字都是小寫的。
? then和sizeof都不是Java的關鍵字。熟悉C或者C++,寫慣了ASP的程序員一定要注意。
? 大寫的NULL不是java語言的關鍵字。String是Java語言的一個封裝類的類名,也不是關鍵字。
下面給出Java語言的關鍵字,如表2.1所示。
表2.1 Java語言的關鍵字

Java語言中的保留字:null、true和false。
Java語言中保留但是未使用的關鍵字:const和goto。
參考答案:(a)。
面試題3 找出Java關鍵字
Which of the following are keyWords or reserved words in Java?(下面哪些是Java語言的關鍵字或者是保留字?)
(a)if
(b)then
(c)goto
(d)while
(e)case
(f)sizeof
考點:主要考察求職者對于Java關鍵字的掌握。
出現頻率:★★★★
【面試題解析】請參考Java關鍵字表。
參考答案:(a)(c)(d)(e)。
面試題4 挑選Java關鍵字
Which of these are key words in java?(下面哪些是Java關鍵字?)
(a)default
(b)NULL
(c)String
(d)throws
(e)long
(f)true
考點:主要考察求職者對于Java關鍵字的掌握。
出現頻率:★★★★
【面試題解析】請參考Java關鍵字表。
參考答案:(a)、(d)、(e)、(f)。
面試題5 選擇完整合法的Java注釋
下面是否為一條完整而且合法的Java注釋?
/*//*/
(a)不是,塊狀注釋(/*…*/)尚未閉合,因為這里單行注釋(//…)注釋掉了塊狀注釋的閉合部分。
(b)這是一個完全有效的注釋。編譯器會忽略//部分。
(c)是一個非法注釋,編譯器會報錯。
考點:考察求職者對Java注釋的熟悉程度。在軟件項目開發中,規范而且完整的注釋可以提高代碼的可讀性和可維護性。
出現頻率:★★★★
【面試題解析】Java語言提供了3種用于程序的注釋。
? 單行注釋://…到行尾。
? 多行注釋:/*…*/。
? 歸檔(Javadoc)注釋:/**…*/。
多行注釋可以跨越多行,以/*開頭,*/結尾,例如:
/* a mothed Test Hello */
注意:如果多行注釋內容出現注釋起始符號,例如//、/*、//*等,編譯器視為普通字符,并不做任何處理。但是多行注釋不能嵌套,如下注釋會引發錯誤:
/* hello Test /* a sub */ */
注釋在軟件開發中的使用。
1.文件頭注釋
文件頭注釋以 /*開始,以*/結束,需要注明該文件的創建時間、文件名、命名空間信息。
例如:
/* * Created on 2005-7-2 * File Test.java * Package com.cn * Create Date:2008-08-01 * /
2.類、接口注釋
類、接口的注釋采用 /** … */,描述部分用來書寫該類的作用或者相關信息,塊標記部分必須注明作者和版本。注釋代碼示例如下:
/**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.構造函數注釋
構造函數注釋采用 /** … */,描述部分注明構造函數的作用,不一定有塊標記部分。
無塊標記的示例如下:
/** * 默認構造函數 */
帶塊標記的示例如下:
/** * 帶參數構造函數,初始化模式名、變量名稱和數據源類型 * @param schema * Ref模式名 * @param name * Ref變量名稱 * @param type * byVal數據源類型 */
4.域注釋
域注釋可以出現在注釋文檔里面,也可以不出現在注釋文檔里面。用/** … */的域注釋將會被認為是注釋文檔而出現在最終生成的HTML報告里面(Javadoc),而使用/* … */的注釋則會被忽略。例如:
/** * @作者 閆術卓 * @創建時間Sep 1, 2008 2:10:30 PM */
上面的域注釋會生成下面的HTML報告:
@作者 閆術卓 @創建時間 Sep 1, 2008 2:10:30 PM
5.方法注釋
方法注釋采用 /** … */,描述部分注明方法的功能,塊標記部分注明方法的參數,返回值、異常等信息。例如:
/** * 設置是否有外碼約束 * * @param conn * Connection與數據庫的連接 */
注意:初級程序員容易忽略Java代碼的注釋,而往往只關注代碼的實現邏輯,高級程序員更加注重代碼的規范性和可讀性。
參考答案:(b)。
面試題6 int和Integer的區別是什么
考點:考察求職者對引用類型和原始類型的區分和理解。
出現頻率:★★★★★
【面試題解析】Java提供引用類型和原始類型(或內置類型)兩種不同的類型。另外,Java還為每個原始類型提供了封裝類(Wrapper)。
表2.2列出了原始類型以及對應的對象封裝類。
表2.2 原始類型和對應的封裝類

引用類型和原始類型的行為完全不同,并且分別具有不同的語義。假定一個方法中有兩個局部變量,一個變量為int原始類型,另一個變量是對一個Integer對象的對象引用,如下所示:
int i = 5; // 原始類型 Integer j = new Integer(10); // 對象引用
這兩個變量都存儲在局部變量表中,并且都是在Java操作數堆棧中被操作的。原始類型int和對象引用各占堆棧的32位(要表示一個int或一個對象引用,Java虛擬機實現至少需要使用32 位存儲)。Integer對象對應的堆棧項并不是對象本身,而是一個對象引用。對象引用是指向對象存儲所在堆中的某個區域的指針。Java中的所有對象都要通過對象引用訪問。而當聲明一個原始類型時,就為類型本身聲明了存儲。
引用類型和原始類型具有不同的特征和用法。以哪種類型的數據結構存儲,決定了以此類型作為某個類的實例數據時所指定的默認值。對象引用實例變量的默認值為null,而原始類型實例變量的默認值與具體的類型有關。
許多程序的代碼將同時包含原始類型以及它們的對象封裝。程序員必須了解這兩種類型是如何工作和相互作用的,以避免代碼出錯。
例如,不能對原始類型調用方法,但可以對對象調用方法。
int j = 5; j.hashCode(); // 錯誤 //... Integer i = new Integer(5); i.hashCode(); // 正確
使用原始類型無須調用new,也無須創建對象,這節省了時間和空間。混合使用原始類型和對象,也可能導致與賦值有關的意外結果,看起來沒有錯誤的代碼,可能無法完成預期工作。示例代碼如下:
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]
修改整數a和b后結果沒意外。b的值被賦予整型變量a,a值增加了1。令人感到意外是在賦值并調用setLocation()函數之后,x和y對象的輸出結果。我們在完成x=y賦值之后,特意對x調用了setLocation,x和y的值怎么會相同呢?將y賦予x,然后更改了x,這與我們對整數a和b進行的操作沒什么不同。
這種混淆是由原始類型和對象的使用造成的。賦值對這兩種類型所起的作用沒什么不同。賦值運算符“=”左邊的值等于右邊的值,這一點對于原始類型(如前面的int類型值a和b)是顯而易見的。對于非原始類型(如Point對象),賦值修改的是對象引用,而不是對象本身。
換句話說,x和y是對象引用,因此,在語句“x=y;”之后,x和y引用同一個對象,對x執行的所有方法與對y執行的方法都作用于同一個對象。
面試題7 哪些不屬于Java的原始類型
請選擇兩個答案。
(a)"abc"
(b)'x'
(c)100.09F
(d)"hello"
(e)false
考點:考察求職者對Java原始類型的掌握。
出現頻率:★★★★
【面試題解析】應該記住Java語言的8個原始類型:boolean、char、byte、short、int、long、float和double。
參考答案:
(a)、(d)。其他都是原始類型,而(a)、(d)是字符串,即一個String對象類型。
面試題8 String和StringBuffer的區別
考點:考察求職者對常用的字符串處理對象的掌握。
出現頻率:★★★★
參考答案:
Java提供了兩個字符串類:String和StringBuffer。它們可以儲存和操作字符串,即包含多個字符的字符串數據。字符串String類提供了數值不可改變的字符串,而StringBuffer類提供的字符串對象可以進行修改。當知道字符數據要改變的時候,就可以使用StringBuffer類創建,典型地,可以使用StringBuffers來動態構造字符數據。
面試題9 指出Java的原始數據類型并說出其分類
考點:考察求職者對Java原始數據類型的掌握。
出現頻率:★★★★
【面試題解析】Java的原始數據類型可以分為以下幾種。
1.基本的整數類型
整數是從負無窮到正無窮之間的任意整型的數據,例如5、0、-128。因為計算機資源有限,并且需要存儲器來存儲變量,所以必須要靈活地定義數量。Java中有4 種已定義的整數類型:byte、short、int和long。每種類型以及它們的存儲空間需求和取值范圍,如表2.3所示。
整數類型的取值范圍由各自的存儲大小決定。例如,int類型需要32位,這使得一個int變量有232=4294967296個不同的取值。由于所有的Java變量都是有符號的(意思是它們必須隱性地傳送正或負的值),有效范圍變為-231(-2147483648)~231-1(2147483647)。Int類型變量的最大值是2147483647而不是2147483648,這是由于0作為一個有效值被包含進來了。
表2.3 整數類型范圍

2.浮點類型
有時整型數據不夠用,一些在數學和物理中使用的值通常用十進制小數表示。Java和C++一樣,支持兩種小數類型:float和double。表2.4給出了它們的存儲方式和有效范圍。
聲明浮點變量的示例如下:
double pi = 2.141592653589793d; float velocity = 30.65f; double gravity = 9.81;
注意,聲明一個float類型的值,必須以f(或F)作為后綴;否則,會被當作double類型。對于double值來說,d(或D)后綴是可選的。
表2.4 浮點類型范圍

雙精度數在本質上給出了相對于浮點數兩倍的精度,但是,這是有代價的——通常是內存的消耗。在Java API中,大部分的方法返回類型和數據成員時使用double型。這在實際開發中值得注意。
3.Char類型
Java中一個字符(用char表達)表示Unicode字符集中的一個元素。Unicode字符由16位組成,因此,有65536個不同的字符可用,這與C++的標準128個ASCII字符不同。Unicode字符集提供了很大的靈活性,它能包含所有不同語言的字符以及常用符號。
字符由單引號括起來的單個字符表達,通常以16進制表示,范圍為'\u0000'~'\uFFFF '(' u '告訴編譯器用戶在用兩個字節字符信息表示一個Unicode字符)。正確使用字符的示例如下:
char letter; char lastInitial = 'R';
注意:與C++中不同,Java中一個字符數組沒有必要組成一個字符串。Java API定義了自己的String類型。一般只有敏感信息,如密碼字段,才會作為字符數組處理。這是因為,Java對象在沒有被Java虛擬機作為不被引用的對象清空之前一直駐留在內存中,把敏感數據留在內存中可能會造成危險的局面。
4.布爾型
布爾型(以19世紀的數學家George Boole的名字命名)給了程序員為變量設置真值的能力。很多語言雖然使用boolean變量,但不把它看作一種獨立的數據類型。在Java中,任何一個boolean變量只有兩個有效值:true和false。boolean型沒有等價的數值賦值,也不允許類型轉換。還有,注意所有的if和while聲明都相當于一個boolean結果。正確使用boolean型示例如下:
boolean isAlive = true; while(isAlive) { // 程序代碼 }
參考答案:
Java的原始數據類型可以分為4類,如下所述。
? 整型:byte、short、int和long。
? 浮點型:float和double。
? Char型:char。
? 布爾型:boolean。
面試題10 理解和掌握Java語言中的變量初始化
編譯并運行下面代碼,請選擇正確的一項。
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的理解。筆者在開發項目時,對這個問題深有體會,在項目試用階段頻繁產生錯誤,耗費了很多精力才找到癥結,發現竟然是一個小小的null引發的。
出現頻率:★★★★★
【面試題解析】Java語言中,變量存放著某一個具體類型的值,一般變量對應著一個名稱標識符、指向一個類型和一個與之關聯的值。Java變量的值有兩種,一種是原始數據類型,另外一種是指向對象的引用,如圖2.1所示。

圖2.1 Java的變量類型示意圖
在Java(TM) 編程語言中,變量的初始化依靠于其所在的上下文。請看下面代碼:
int x; Dog fido;
假如x和fido都是實例變量,它們就分別被自動初始化為0和null。null是一個非凡的字面值,它能賦值給任何引用變量。一般說來,假如實例變量在定義的時候沒有被顯式地初始化,那么Java將變量自動初始化為“似零”的值,具體值由變量的數據類型決定,如表2.5所示。
表2.5 Java變量的默認初始化值

請參考如下代碼:
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運行后輸出如下結果:
D:\>java TestVariableInit tc.iStr = null tc.i = 0
這種變量的默認初始化并不是在所有的情況下都適用,例如,一個局部變量(在方法體內聲明的變量)假如沒有顯式初始化,根據所在Java環境不同,編譯器會給出一個警告或者是報出一個錯誤。
實際情況是,以前有些Java環境對局部變量不提供初始化,也不給出警告或者錯誤。在這種情況下,值是垃圾,可能造成非常難于診斷的運行錯誤。
Oracle公司發布的Java開發包(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會產生下面的輸出:
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環境保證給出一個默認值,但是不答應開發者使用它,這有些不可思議。大部分的程序員都贊成為了可讀性更好,實例變量應該初始化,并且局部變量必須初始化,這樣不管在哪種Java環境中,源代碼都可以被編譯,而不必關心源代碼的編寫者是誰。
注意:對象的默認初始值為null,但是系統并沒有創建一個相對應的對象,只是創建了一個可以存儲對象引用的變量。這是Java程序員在軟件開發中遇到的最常見的一個錯誤。令人惱火的是,這些錯誤只有在運行的時候才會出現。在一個大型軟件項目的開發中,由于這個小小的錯誤導致大問題屢見不鮮。
例如,變量聲明如下:
String str;
由于str是一個String類型的變量,系統會自動分配一個存儲單元,用來存放String對象的引用,但是并沒有創建一個String對象。代碼如下:
public class TestVariableInit { public static void main(String[] args) { TestClass tc = new TestClass(); //千萬注意,這里并沒有編譯錯誤,會產生運行時錯誤! 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語言的變量聲明和轉義符的認識。
出現頻率:★★★★
【面試題解析】在Java源代碼中,可以使用Unicode值來表示字符型字,一般形式為\uxxxx,Java編譯器會將這些Unicode值轉換為字符來處理。
例如:
char \u0061='a ';
編譯器會將其翻譯為:
char a= 'a ';
表2.6給出了常見的Java轉義符。
表2.6 Java常用的轉義符

注意:在Java源代碼中,不能使用\u000a和\u000d來替代換行和回車,這樣編譯器會將這些值解釋為終止符,導致編譯錯誤。
【面試題解析】參考前面介紹。
參考答案:(a)、(c)、(d)。
面試題12 選擇正確的代碼運行結果
編譯運行下面代碼,正確的運行結果是?
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)編譯正常,運行出現錯誤。
考點:考察求職者對Java語言的變量聲明和轉義符的認識。
出現頻率:★★★★
參考答案:(b)。
面試題13 空文件是否為一個有效的Java程序源文件
考點:考察求職者對Java源文件結構的理解。
出現頻率:★★★
【面試題解析】Java程序員最基本的知識之一就是掌握Java源文件的結構。Java源文件可以包括如下幾個結構:
? package包;
? import內容;
? 類型聲明。
其中,package用來制定該文件所處的包的名稱,必須位于源文件頂端;import用來指定所引入的一個或者多個包;類型聲明是任意的頂層類聲明和接口的聲明。
類和接口的定義次序是任意的,二者合起來稱為類型聲明。實際上,源文件可以不需要任何這樣的定義。Java SDK要求一個源文件中最多只能定義一個公共類,同時該源文件的文件名必須同該類相同。例如,某個公共類名稱為Hello,那么源文件名稱必須為Hello.java。
參考答案:是。
面試題14 嘗試編譯代碼并判斷結果
編譯下面的代碼,檢查結果。
import java.util.*; package com.dir; public Hello{ …… } Class Other{ …… }
請選擇一個正確的答案。
(a)編譯錯誤,類Hello和Other不能出現在一個源文件中。
(b)編譯正確。
(c)編譯錯誤,因為import不能位于源文件的頂端。
(d)編譯錯誤,因為package必須在import之前。
(e)編譯錯誤,因為Hello不能聲明為公共的。
【面試題解析】從前面的講解來看,明顯的答案是(d),因為Java源文件的包聲明必須在頂端。
參考答案:(d)。
面試題15 關于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()方法的掌握。
出現頻率:★★★★
【面試題解析】在Java中,main()方法是Java應用程序的入口方法,也就是說,程序在運行的時候,第1個執行的方法就是main()方法。這個方法和其他的方法有很大的不同。方法的名字必須是main,方法必須是public static void類型的,方法必須接收一個字符串數組的參數等。
通過一個最簡單的Java應用程序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應用程序,通過JVM直接啟動運行的程序。既然是類,java允許類不加public關鍵字約束,當然類的定義只能限制為public或者無限制關鍵字(默認的)。
2.main()方法
這個main()方法的聲明為:public static void main(String args[])。必須這么定義,這是Java的規范,和JVM的運行有關系。
當一個類中有main()方法,執行命令“java類名”,則會啟動JVM執行該類中的main()方法。由于JVM在運行這個Java應用程序的時候,首先會調用main()方法,調用時不實例化這個類的對象,而是通過類名直接調用,因此需要是限制為公共(public)和靜態(static)的。對于Java中的main()方法,JVM有限制,不能有返回值,因此返回值類型為void。
main()方法中需要一個輸入參數,類型為String[],這個也是Java的規范,至于字符串數組的名字,是可以自己設定的。根據習慣,這個字符串數組的名字一般和Java規范范例中mian()方法的參數名保持一致(args)。
3.main()方法不能拋出異常
main()方法中的異常要么處理,要么不處理,不能繼續拋出。public static int main(String args[]) throws Exception來定義main()方法是錯誤的。
4.main()方法中字符串參數數組作用
main()方法中字符串參數數組作用是接收命令行輸入參數的,命令行的參數之間用空格隔開。下面給出一個例子,看看如何初始化和使用這個數組。
/** * Created by IntelliJ IDEA. * Date: 2013-08-03 * Time: 10:22:15 * 打印main()方法中的輸入參數 */ public class TestMain { public static void main(String args[]){ System.out.println("打印main()方法中的輸入參數!"); for(int i=0;i System.out.println(args[i]); } } }
執行方法和運行結果如下:
D:\Study\basetest\src>javac TestMain.java D:\Study\basetest\src>java TestMain 1 2 3 打印main()方法中的輸入參數! 1 2 3
注意:main()方法作為一個特殊的規范,與普通的方法有很大區別,限制很多,理解其原理需要學習JVM相關知識。這是Java學習中大的障礙。
參考答案:(d)、(f)。