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