1. Java 語言的優(yōu)點?
簡單、高效
Java 語言與 C++ 類似,如果用戶了解 C++ 和面向?qū)ο蟮母拍睿涂梢院芸炀帉懗?Java 程序;此外,Java 又不同于諸如 C++ 語言提供的各種各樣的方法,它只提供了基本的方法,這樣就減少了編程的復(fù)雜性,例如去掉了頭文件、指針變量、結(jié)構(gòu)、運算符重載、多重繼承等復(fù)雜特性。Java 語言雖然簡單,卻很高效,它可以用面向?qū)ο蟮姆椒▉砻枋鲇脩舻拿恳粋€動作。
面向?qū)ο?/span>
Java 語言是一種新的面向?qū)ο蟮某绦蛟O(shè)計語言,它除了幾種基本的數(shù)據(jù)類型外,大都是類似 C++ 中的對象和方法,程序代碼大多體現(xiàn)了類機制,以類的形式組織,由類來定義對象的各種行為。Java 同樣支持類繼承,這樣也減少了程序設(shè)計的復(fù)雜性。
平臺無關(guān)性
所謂一處編譯處處運行。Java 語言經(jīng)編譯后生成與計算機硬件結(jié)構(gòu)無關(guān)的字節(jié)代碼( Bytecode ),這些字節(jié)代碼被定義為不依賴任何硬件平臺和操作系統(tǒng)。當(dāng) Java 程序在運行時,需要由一個解釋程序?qū)ι傻淖止?jié)代碼解釋執(zhí)行。這體現(xiàn)了Java語言的與平臺無關(guān)性,使得 Java 程序可以在任何平臺上運行,如 MS-DOS ,
Windows,Unix 等,因此具有很強的移植性。
交互式特性
Java 是面向?qū)ο蟮木W(wǎng)絡(luò)編程語言,由于它支持 TCP/IP 協(xié)議,使得用戶可以通過瀏覽器訪問到 Internet 上的各種動態(tài)對象。并且在網(wǎng)絡(luò)上用戶可以交互式地進(jìn)行各種動作,而多線程技術(shù)的引入使得這種交互式操作更為容易。
多線程機制
Java 語言支持多線程機制,多線程機制使得 Java 程序能夠并行處理多項任務(wù)。Java 程序可以設(shè)計成具有多個線程,例如讓一個線程負(fù)責(zé)數(shù)據(jù)的檢索、查尋,另一個線程與用戶進(jìn)行交互,這樣,兩個線程得以并行執(zhí)行。多線程機制可以很容易地實現(xiàn)網(wǎng)絡(luò)上的交互式操作。
動態(tài)的內(nèi)存管理機制
Java 語言采用了自動垃圾回收機制進(jìn)行內(nèi)存的管理。在 C++ 語言中,程序員在編寫程序時要仔細(xì)地處理內(nèi)存的使用,例如當(dāng)某個內(nèi)存快使用完畢時,要及時釋放,以供其它程序使用,一旦內(nèi)存管理不當(dāng),就有可能造成內(nèi)存空間浪費或程序運行故障。 在 Java 系統(tǒng)中包括了一個自動垃圾回收程序,它可以自動、安全地回收不再使用的內(nèi)存塊,這樣,程序員在編程時就無需擔(dān)心內(nèi)存的管理問題,從而使 Java 程序的編寫變得簡單,同時也減少了內(nèi)存管理方面出錯的可能性。
安全性
在類似 Internet 的這種分布式網(wǎng)絡(luò)環(huán)境中,安全性是個不容忽視的問題。Java 語言在安全性方面引入了實時內(nèi)存分配及布局來防止程序員直接修改物理內(nèi)存布局;通過字節(jié)代碼驗證器對字節(jié)代碼的檢驗,以防止網(wǎng)絡(luò)病毒及其它非法代碼侵入。此外,Java 語言還采用了許多面向?qū)ο蟮漠惓L幚頇C制,負(fù)責(zé)對一些異常事件進(jìn)行處理,如內(nèi)存空間不夠,程序異常中止等的處理
Java 是解釋型的
運行 Java 程序需要一個解釋器。Java 程序編譯成 Java 虛擬機編碼,這種編碼稱為字節(jié)碼。字節(jié)碼是獨立于計算機的,他能在所有具有 Java 解釋器的機器上運行,Java 解釋器也是 JVM 的一部分。
Java 的效率
早期 Sun 發(fā)現(xiàn) JVM 的用戶注意到了 Java 運行很慢,但是新的 Java 虛擬機顯著加快。新的虛擬機使用了一種稱為實時編譯的技術(shù),他把字節(jié)碼編譯并儲存成本機的機器碼。當(dāng)執(zhí)行字節(jié)碼時,重調(diào)本地碼。
2. 什么是 Java 虛擬機?為什么 Java 被稱作是“平臺無關(guān)的編程語言”?
Java 虛擬機是一個可以執(zhí)行 Java 字節(jié)碼的虛擬機進(jìn)程。Java 源文件被編譯成能被 Java 虛擬機執(zhí)行的字節(jié)碼文件。
Java 被設(shè)計成允許應(yīng)用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。Java 虛擬機讓這個變?yōu)榭赡埽驗樗赖讓佑布脚_的指令長度和其他特性。
3. Java 和 C++ 有何區(qū)別?
Java 和 C++ 都是面向?qū)ο笳Z言。也就是說,它們都能夠?qū)崿F(xiàn)面向?qū)ο笏枷?封裝,繼乘,多態(tài))。而由于 C++ 為了照顧大量的 C 語言使用者,而兼容了 C ,使得自身僅僅成為了帶類的 C 語言,多多少少影響了其面向?qū)ο蟮膹氐仔?Java 則是完全的面向?qū)ο笳Z言,它句法更清晰,規(guī)模更小,更易學(xué)。它是在對多種程序設(shè)計語言進(jìn)行了深入細(xì)致研究的基礎(chǔ)上,據(jù)棄了其他語言的不足之處,從根本上解決了 C++ 的固有缺陷。
Java 和 C++ 的相似之處多于不同之處,但兩種語言問幾處主要的不同使得Java更容易學(xué)習(xí),并且編程環(huán)境更為簡單。我在這里不能完全列出不同之處,僅列出比較顯著的區(qū)別:
指針
Java 語言讓編程者無法找到指針來直接訪問內(nèi)存無指針,并且增添了自動的內(nèi)存管理功能,從而有效地防止了 C/C++ 語言中指針操作失誤,如野指針?biāo)斐傻南到y(tǒng)崩潰。但也不是說 Java 沒有指針,虛擬機內(nèi)部還是使用了指針,只是外人不得使用而已。這有利于 Java 程序的安全。
多重繼承
C++ 支持多重繼承,這是 C++ 的一個特征,它允許多父類派生一個類。盡管多重繼承功能很強,但使用復(fù)雜,而且會引起許多麻煩,編譯程序?qū)崿F(xiàn)它也很不容易。Java 不支持多重繼承,但允許一個類繼承多個接口 (extends+implement) ,實現(xiàn)了 C++ 多重繼承的功能,又避免了 C++ 中的多重繼承實現(xiàn)方式帶來的諸多不便。
數(shù)據(jù)類型及類
Java 是完全面向?qū)ο蟮恼Z言,所有函數(shù)和變量部必須是類的一部分。除了基本數(shù)據(jù)類型之外,其余的都作為類對象,包括數(shù)組。對象將數(shù)據(jù)和方法結(jié)合起來,把它們封裝在類中,這樣每個對象都可實現(xiàn)自己的特點和行為。而 C++ 允許將函數(shù)和變量定義為全局的。此外,Java 中取消了 C/C++ 中的結(jié)構(gòu)和聯(lián)合,消除了不必要的麻煩。
自動內(nèi)存管理
Java 程序中所有的對象都是用 new 操作符建立在內(nèi)存堆棧上,這個操作符類似于 C++ 的 new 操作符。下面的語句由一個建立了一個類Read的對象,然后調(diào)用該對象的 work 方法:
語句 Read r=new Read() ;在堆棧結(jié)構(gòu)上建立了一個 Read 的實例。Java 自動進(jìn)行無用內(nèi)存回收操作,不需要程序員進(jìn)行刪除。而 C++ 中必須由程序員釋放內(nèi)存資源,增加了程序設(shè)計者的負(fù)擔(dān)。Java 中當(dāng)一個對象不被再用到時,無用內(nèi)存回收器將給它加上標(biāo)簽以示刪除。Java 里無用內(nèi)存回收程序是以線程方式在后臺運行的,利用空閑時間工作。
操作符重載
Java 不支持操作符重載。操作符重載被認(rèn)為是 C++ 的突出特征,在Java 中雖然類大體上可以實現(xiàn)這樣的功能,但操作符重載的方便性仍然丟失了不少。Java 語言不支持操作符重載是為了保持 Java 語言盡可能簡單。
預(yù)處理功能
Java 不支持預(yù)處理功能。C/C++ 在編譯過程中都有一個預(yù)編澤階段,即眾所周知的預(yù)處理器。預(yù)處理器為開發(fā)人員提供了方便,但增加了編譯的復(fù)雜性。Java 虛擬機沒有預(yù)處理器,但它提供的引入語句 (import) 與 C++ 預(yù)處理器的功能類似。
Java不支持缺省函數(shù)參數(shù),而C++支持
在 C 中,代碼組織在函數(shù)中,函數(shù)可以訪問程序的全局變量。C++ 增加了類,提供了類算法,該算法是與類相連的函數(shù),C++ 類方法與 Java 類方法十分相似,然而,由于 C++ 仍然支持 C ,所以不能阻止 C++ 開發(fā)人員使用函數(shù),結(jié)果函數(shù)和方法混合使用使得程序比較混亂。
Java 沒有函數(shù),作為一個比 C++ 更純的面向?qū)ο蟮恼Z言,Java 強迫開發(fā)人員把所有例行程序包括在類中,事實上,用方法實現(xiàn)例行程序可激勵開發(fā)人員更好地組織編碼。
字符串
C 和 C++ 不支持字符串變量,在 C 和 C++ 程序中使用 Null 終止符代表字符串的結(jié)束,在 Java 中字符串是用類對象 ( string 和stringBuffer )來實現(xiàn)的,這些類對象是 Java 語言的核心,用類對象實現(xiàn)字符串有以下幾個優(yōu)點:
(1)在整個系統(tǒng)中建立字符串和訪問字符串元素的方法是一致的;
(2)Java 字符串類是作為 Java 語言的一部分定義的,而不是作為外加的延伸部分;
(3)Java 字符串執(zhí)行運行時檢查,可幫助排除一些運行時發(fā)生的錯誤;
(4)可對字符串用“+”進(jìn)行連接操作。
goto 語句
“可怕”的 goto 語句是 C 和 C++ 的“遺物”,它是該語言技術(shù)上的合法部分,引用 goto 語句引起了程序結(jié)構(gòu)的混亂,不易理解,goto 語句子要用于無條件轉(zhuǎn)移子程序和多結(jié)構(gòu)分支技術(shù)。鑒于以廣理由,Java 不提供 goto 語句,它雖然指定 goto 作為關(guān)鍵字,但不支持它的使用,使程序簡潔易讀。
類型轉(zhuǎn)換
在 C 和 C++ 中有時出現(xiàn)數(shù)據(jù)類型的隱含轉(zhuǎn)換,這就涉及了自動強制類型轉(zhuǎn)換問題。例如,在 C++ 中可將一浮點值賦予整型變量,并去掉其尾數(shù)。Java 不支持 C++ 中的自動強制類型轉(zhuǎn)換,如果需要,必須由程序顯式進(jìn)行強制類型轉(zhuǎn)換。
異常
Java 中的異常機制用于捕獲例外事件,增強系統(tǒng)容錯能力
其中 exceptionType 表示異常類型。而 C++ 則沒有如此方便的機制。
4. JDK 和 JRE 的區(qū)別是什么?
Java 運行時環(huán)境( JRE )是將要執(zhí)行 Java 程序的 Java 虛擬機。它同時也包含了執(zhí)行 Applet 需要的瀏覽器插件。Java 開發(fā)工具包( JDK )是完整的 Java 軟件開發(fā)包,包含了 JRE ,編譯器和其他的工具(比如: JavaDoc,Java 調(diào)試器),可以讓開發(fā)者開發(fā)、編譯、執(zhí)行 Java 應(yīng)用程序。
5. Java 支持的數(shù)據(jù)類型有哪些?什么是自動拆裝箱?
Java 語言支持的 8 中基本數(shù)據(jù)類型是:
byte
short
int
long
float
double
boolean
char
自動裝箱是 Java 編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型之間做的一個轉(zhuǎn)化。比如:把 int 轉(zhuǎn)化成 Integer ,double 轉(zhuǎn)化成 Double,等等。反之就是自動拆箱。
6. 什么是值傳遞和引用傳遞?
對象被值傳遞,意味著傳遞了對象的一個副本。因此,就算是改變了對象副本,也不會影響源對象的值。
對象被引用傳遞,意味著傳遞的并不是實際的對象,而是對象的引用。因此,外部對引用對象所做的改變會反映到所有的對象上。
7. 一個 ".java" 源文件中是否可以包括多個類(不是內(nèi)部類)?有什么限制?
可以有多個類,但只能有一個 public 的類,并且 public 的類名必須與文件名相一致。
8. 靜態(tài)變量和實例變量的區(qū)別?
在語法定義上的區(qū)別:靜態(tài)變量前要加 static 關(guān)鍵字,而實例變量前則不加。
在程序運行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了。總之,實例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。
例如,對于下面的程序,無論創(chuàng)建多少個實例對象,永遠(yuǎn)都只分配了一個 staticVar
變量,并且每創(chuàng)建一個實例對象,這個 staticVar 就會加 1 ;但是,每創(chuàng)建一個實例對象,就會分配一個 instanceVar ,即可能分配多個 instanceVar ,并且每個instanceVar 的值都只自加了 1 次。
9. 不通過構(gòu)造函數(shù)也能創(chuàng)建對象嗎?
A. 是
B. 否
答案:A
解析:Java 創(chuàng)建對象的幾種方式(重要):
(1) 用 new 語句創(chuàng)建對象,這是常見的創(chuàng)建對象的方法。
(2) 運用反射手段,調(diào)用 java.lang.Class 或者 java.lang.reflect.Constructor 類的 newInstance() 實例方法。
(3) 調(diào)用對象的 clone() 方法。
(4) 運用反序列化手段,調(diào)用 java.io.ObjectInputStream 對象的 readObject() 方法。
(1)和(2)都會明確的顯式的調(diào)用構(gòu)造函數(shù) ;(3)是在內(nèi)存上對已有對象的影印,所以不會調(diào)用構(gòu)造函數(shù) ;(4)是從文件中還原類的對象,也不會調(diào)用構(gòu)造函數(shù)。
10. 靜態(tài)變量和實例變量的區(qū)別?
答:靜態(tài)變量是被 static 修飾符修飾的變量,也稱為類變量,它屬于類,不屬于類的任何一個對象,一個類不管創(chuàng)建多少個對象,靜態(tài)變量在內(nèi)存中有且僅有一個拷貝;實例變量必須依存于某一實例,需要先創(chuàng)建對象然后通過對象才能訪問到它。靜態(tài)變量可以實現(xiàn)讓多個對象共享內(nèi)存。在 Java 開發(fā)中,上下文類和工具類中通常會有大量的靜態(tài)成員。
11. 是否可以從一個靜態(tài)(static)方法內(nèi)部發(fā)出對非靜態(tài)(non-static)方法的調(diào)用?
答:不可以,靜態(tài)方法只能訪問靜態(tài)成員,因為非靜態(tài)方法的調(diào)用要先創(chuàng)建對象,因此在調(diào)用靜態(tài)方法時可能對象并沒有被初始化。
12. 如何實現(xiàn)對象克隆?
答:有兩種方式:
1.實現(xiàn) Cloneable 接口并重寫 Object 類中的 clone() 方法;
2.實現(xiàn) Serializable 接口,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)真正的深度克隆。
13. 一個“.java”源文件中是否可以包含多個類(不是內(nèi)部類)?有什么限制?
答:可以,但一個源文件中多只能有一個公開類(public class)而且文件名必須和公開類的類名完全保持一致。
14. Anonymous Inner Class(匿名內(nèi)部類)是否可以繼承其它類?是否可以實現(xiàn)接口?
答:可以繼承其他類或?qū)崿F(xiàn)其他接口,在Swing編程中常用此方式來實現(xiàn)事件監(jiān)聽和回調(diào)。
15. 內(nèi)部類可以引用它的包含類(外部類)的成員嗎?有沒有什么限制?
答:一個內(nèi)部類對象可以訪問創(chuàng)建它的外部類對象的成員,包括私有成員
16. 列出自己常用的 jdk 包.
答:JDK 常用的 package
java.lang:這個是系統(tǒng)的基礎(chǔ)類,比如 String 等都是這里面的,這個 package 是唯一一個可以不用 import 就可以使用的 Package
java.io: 這里面是所有輸入輸出有關(guān)的類,比如文件操作等
java.net: 這里面是與網(wǎng)絡(luò)有關(guān)的類,比如 URL,URLConnection 等。
java.util: 這個是系統(tǒng)輔助類,特別是集合類 Collection,List,Map 等。
java.sql: 這個是數(shù)據(jù)庫操作的類,Connection, Statememt,ResultSet 等
17. JDK, JRE 和 JVM 的區(qū)別?
JDK, JRE 和 JVM 是 Java 編程語言的核心概念。盡管它們看起來差不多,作為程序員我們也不怎么關(guān)心這些概念,但是它們是不同的針對特定目的的產(chǎn)品。這是一道常見的 Java 面試題,而本文則會一一解釋這些概念并給出它們之間的區(qū)別。
Java 開發(fā)工具包 (JDK)
Java 開發(fā)工具包是 Java 環(huán)境的核心組件,并提供編譯、調(diào)試和運行一個 Java 程序所需的所有工具,可執(zhí)行文件和二進(jìn)制文件。JDK 是一個平臺特定的軟件,有針對 Windows,Mac 和 Unix 系統(tǒng)的不同的安裝包。可以說 JDK 是 JRE 的超集,它包含了 JRE 的 Java 編譯器,調(diào)試器和核心類。目前 JDK 的版本號是 1.7,也被稱為 Java 7。
Java 虛擬機(JVM)
JVM 是 Java 編程語言的核心。當(dāng)我們運行一個程序時,JVM 負(fù)責(zé)將字節(jié)碼轉(zhuǎn)換為特定機器代碼。JVM 也是平臺特定的,并提供核心的 Java 方法,例如內(nèi)存管理、垃圾回收和安全機制等。JVM 是可定制化的,我們可以通過 Java 選項(java options)定制它,比如配置 JVM 內(nèi)存的上下界。JVM 之所以被稱為虛擬的是因為它提供了一個不依賴于底層操作系統(tǒng)和機器硬件的接口。這種獨立于硬件和操作系統(tǒng)的特性正是 Java 程序可以一次編寫多處執(zhí)行的原因。
Java 運行時環(huán)境(JRE)
JRE 是 JVM 的實施實現(xiàn),它提供了運行 Java 程序的平臺。JRE 包含了 JVM、Java 二進(jìn)制文件和其它成功執(zhí)行程序的類文件。JRE 不包含任何像 Java 編譯器、調(diào)試器之類的開發(fā)工具。如果你只是想要執(zhí)行 Java 程序,你只需安裝 JRE 即可,沒有安裝 JDK 的必要。
JDK, JRE 和 JVM 的區(qū)別
JDK 是用于開發(fā)的而 JRE 是用于運行 Java 程序的。
JDK 和 JRE 都包含了 JVM,從而使得我們可以運行 Java 程序。
JVM 是 Java 編程語言的核心并且具有平臺獨立性。(相關(guān)推薦:)
即時編譯器(JIT)
有時我們會聽到 JIT 這個概念,并說它是 JVM 的一部分,這讓我們很困惑。JIT 是 JVM 的一部分,它可以在同一時間編譯類似的字節(jié)碼來優(yōu)化將字節(jié)碼轉(zhuǎn)換為機器特定語言的過程相似的字節(jié)碼,從而將優(yōu)化字節(jié)碼轉(zhuǎn)換為機器特定語言的過程,這樣減少轉(zhuǎn)換過程所需要花費的時間。