“static” 關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒有所屬的類的實(shí)例變量的情況下被訪問。
Java 中 static 方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動態(tài)綁定的,而 static 方法是編譯時(shí)靜態(tài)綁定的。static 方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
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)上。
修飾符 | 當(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)部類)的修飾符可以是以上四種。
答案:不能
解析: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ā)的情況。
答: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)類庫中使用過的有特殊意義的單詞或單詞的組合都被視為保留字)
答:
(1)修飾類:表示該類不能被繼承;
(2)修飾方法:表示方法不能被重寫;
(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)。
答: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)記。
答:
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í)行其他清理工作。