鍍金池/ 教程/ Java/ 關(guān)鍵字
異常處理
基本類型與運(yùn)算
Java 平臺與內(nèi)存管理
XML
輸入輸出流
JDBC 與數(shù)據(jù)庫
字符串與數(shù)組
Java 多線程
面向?qū)ο缶幊?/span>
集合類
UML
J2EE 與 EJB
Java 基本概念
Servlet 與 JSP
關(guān)鍵字
常見設(shè)計(jì)模式
SSH 架構(gòu)

關(guān)鍵字

1. ”static” 關(guān)鍵字是什么意思?Java 中是否可以覆蓋(override) 一個(gè) private 或者是 static 的方法?

“static” 關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒有所屬的類的實(shí)例變量的情況下被訪問。

Java 中 static 方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動態(tài)綁定的,而 static 方法是編譯時(shí)靜態(tài)綁定的。static 方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。

2. 是否可以在 static 環(huán)境中訪問非 static 變量?

static 變量在 Java 中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被Java虛擬機(jī)載入的時(shí)候,會對 static 變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來訪問非 static 的變量,編譯器會報(bào)錯(cuò),因?yàn)檫@些變量還沒有被創(chuàng)建出來,還沒有跟任何實(shí)例關(guān)聯(lián)上。

3. 訪問修飾符 public, private, protected, 以及不寫(默認(rèn))時(shí)的區(qū)別?

修飾符 當(dāng)前類 同 包 子 類 其他包
public
protected ×
default × ×
private × × ×

類的成員不寫訪問修飾時(shí)默認(rèn)為 default 。默認(rèn)對于同一個(gè)包中的其他類相當(dāng)于公開(public),對于不是同一個(gè)包中的其他類相當(dāng)于私有(private)。受保護(hù)(protected)對子類相當(dāng)于公開,對不是同一包中的沒有父子關(guān)系的類相當(dāng)于私有。Java 中,外部類的修飾符只能是 public 或默認(rèn),類的成員(包括內(nèi)部類)的修飾符可以是以上四種。

4. volatile關(guān)鍵字是否能保證線程安全?

答案:不能

解析:volatile 關(guān)鍵字用在多線程同步中,可保證讀取的可見性,JVM只是保證從主內(nèi)存加載到線程工作內(nèi)存的值是最新的讀取值,而非 cache 中。但多個(gè)線程對 volatile 的寫操作,無法保證線程安全。例如假如線程 1,線程 2 在進(jìn)行 read,load 操作中,發(fā)現(xiàn)主內(nèi)存中 count 的值都是 5,那么都會加載這個(gè)最新的值,在線程 1 堆 count 進(jìn)行修改之后,會 write 到主內(nèi)存中,主內(nèi)存中的 count 變量就會變?yōu)?6;線程 2 由于已經(jīng)進(jìn)行 read,load 操作,在進(jìn)行運(yùn)算之后,也會更新主內(nèi)存 count 的變量值為 6;導(dǎo)致兩個(gè)線程及時(shí)用 volatile 關(guān)鍵字修改之后,還是會存在并發(fā)的情況。

5. Java 有沒有 goto?

答:goto 是 Java 中的保留字,在目前版本的 Java 中沒有使用。(根據(jù)James Gosling(Java 之父)編寫的《The Java Programming Language》一書的附錄中給出了一個(gè) Java 關(guān)鍵字列表,其中有 goto 和 const,但是這兩個(gè)是目前無法使用的關(guān)鍵字,因此有些地方將其稱之為保留字,其實(shí)保留字這個(gè)詞應(yīng)該有更廣泛的意義,因?yàn)槭煜?C 語言的程序員都知道,在系統(tǒng)類庫中使用過的有特殊意義的單詞或單詞的組合都被視為保留字)

6. Java 中的 final關(guān)鍵字有哪些用法?

答:
(1)修飾類:表示該類不能被繼承;
(2)修飾方法:表示方法不能被重寫;
(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)。

7. 什么時(shí)候用 assert?

答:assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都支持這種機(jī)制。一般來說,assertion 用于保證程序最基本、關(guān)鍵的正確性。assertion 檢查通常在開發(fā)和測試時(shí)開啟。為了提高性能,在軟件發(fā)布后, assertion 檢查通常是關(guān)閉的。在實(shí)現(xiàn)中,斷言是一個(gè)包含布爾表達(dá)式的語句,在執(zhí)行這個(gè)語句時(shí)假定該表達(dá)式為 true;如果表達(dá)式計(jì)算為 false,那么系統(tǒng)會報(bào)告一個(gè) AssertionError。

斷言用于調(diào)試目的:

assert(a > 0); // throws an AssertionError if a <= 0

斷言可以有兩種形式:

assert Expression1;

assert Expression1 : Expression2 ;

Expression1 應(yīng)該總是產(chǎn)生一個(gè)布爾值。

Expression2 可以是得出一個(gè)值的任意表達(dá)式;這個(gè)值用于生成顯示更多調(diào)試信息的字符串消息。

斷言在默認(rèn)情況下是禁用的,要在編譯時(shí)啟用斷言,需使用 source 1.4 標(biāo)記:

javac -source 1.4 Test.java

要在運(yùn)行時(shí)啟用斷言,可使用 -enableassertions 或者 -ea 標(biāo)記。

要在運(yùn)行時(shí)選擇禁用斷言,可使用 -da 或者 -disableassertions 標(biāo)記。

8. final, finally, finalize 的區(qū)別?

答:

final:修飾符(關(guān)鍵字)有三種用法:如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,即不能被繼承,因此它和 abstract 是反義詞。將變量聲明為 final,可以保證它們在使用中不被改變,被聲明為 final 的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取不可修改。被聲明為 final 的方法也同樣只能使用,不能在子類中被重寫。

finally:通常放在 try…catch 的后面構(gòu)造總是執(zhí)行代碼塊,這就意味著程序無論正常執(zhí)行還是發(fā)生異常,這里的代碼只要 JVM 不關(guān)閉都能執(zhí)行,可以將釋放外部資源的代碼寫在 finally 塊中。

finalize:Object 類中定義的方法,Java 中允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在銷毀對象時(shí)調(diào)用的,通過重寫finalize() 方法可以整理系統(tǒng)資源或者執(zhí)行其他清理工作。