1.Java語言有什麼特點?和C++有什麼關系和差別?
面向對象(封裝,繼承,多态);
平台無關性,具體表現在,Java是“一次編寫,到處運作”的語言。是以采用Java語言編寫的程式具有很好的可移植性,而保證這一點的原始是Java的虛拟機機制。在引入虛拟機之後,Java語言在不同的平台上運作不需要重新編譯;
可靠性,安全性;
支援多線程。C++語言沒有内置的多線程機制,是以必須調用作業系統的多線程功能來進行多線程程式設計,而Java語言提供了多線程支援;
支援網絡程式設計并且很友善。Java語言誕生就是為了簡化網絡程式設計設計的,是以Java語言不僅支援網絡程式設計而且很友善;
編譯與解釋并存。
Java和C++的關系和差別
Java | C++ |
面向對象,支援封裝,繼承和多态 | |
沒有指針 | 支援指針 |
不支援多繼承,但允許一個類實作多個接口 | 支援多繼承 |
自動進行無用記憶體回收操作 | 必須由程式釋放記憶體資源 |
不支援操作符重載 | 支援操作符重載 |
沒有結束符 | 字元串或者字元數組最後都會有一個額外的字元“\o”來表示結束 |
不提供goto語句,但goto作為關鍵字 | 提供goto語句 |
2.關于JVM,JDK和JRE之間的關系
JDK(Java Development Kit),是功能齊全的Java SDK。它擁有JRE所擁有的一切,還有編譯器javac和工具,如javadoc和jdb。它能夠建立和編譯程式。
JRE(Java Runtime Environment),它是運作已編譯Java程式所需的所有内容的集合,包括Java虛拟機JVM,Java類庫,java指令和其他的一些基礎構件。但是,它不能用于建立新程式。
JDK包含JRE,JRE包含JVM。
JVM:Java虛拟機,即為JVM,是運作Java位元組碼的虛拟機。JVM有針對不同系統的特定實作(Windows,Linux,macOS),目的是使用相同的位元組碼,他們都會給出相同的結果。位元組碼和不同系統的JVM實作是Java語言“一次編譯,到處運作”的關鍵。
如果隻是為了運作一下Java程式的話,隻需要安裝JRE即可;如果需要進行Java程式設計方面的工作,那就需要安裝JDK。有時,即使你不需要進行Java開發,也需要安裝JDK。比如
用JSP部署Web應用程式,應用程式伺服器會将JSP轉換為Java servlet,并且需要使用JDK來編譯servlet。
那什麼是位元組碼?采用位元組碼的好處?
在Java中,JVM可以了解的代碼叫做位元組碼,即擴充名為.class的檔案。位元組碼檔案是由十六進制組成,JVM以兩個十六進制值為一組,即以位元組為機關進行讀取。它不面向任何特定的處理器,隻面向虛拟機。Java語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。是以Java程式運作比較高效。而且由于位元組碼并不針對一種特定的機器,是以,Java程式無需重新編譯既可在多種不同作業系統上的計算機上運作。
Java從源代碼到運作一般是下面3步:
Java是編譯執行的語言,還是解釋執行的語言?
需要注意.class->機器碼這一步。這一步JVM類加載器首先加載位元組碼檔案,然後通過解釋器逐行解釋執行,這種執行速度會相對比較慢。而且有些方法和代碼塊是經常需要被調用的(熱點代碼),是以後面引進了JIT編譯器,JIT屬于運作時編譯。當JIT編譯器完成第一次編譯後,會将位元組碼對應的機器碼儲存下來,下次直接使用。機器碼的運作效率高于Java解釋器的。這就解釋了Java是編譯與解釋共存的語言。
3.Java有哪些資料類型?
資料類型分為兩種:基本資料類型和引用資料類型
基本資料類型:boolean(布爾型),float(單精度浮點型),char(字元型),byte(位元組型),
Short(短整型),int(整型),long(長整型),double(雙精度浮點型)
引用資料類型:建立在基本資料類型上,包括數組,類和接口。
Java不支援C++中的指針類型,結構類型,聯合類型和枚舉類型。
字元型常量和字元串常量的差別?
包裝類型是什麼?基本類型和包裝類型有什麼差別?
Java為每一個基本資料類型都引入了對應的包裝類型,int的包裝類就是Integer。
原始類型:boolean,char,byte,short,int,long,float,double
包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
那麼基本類型和包裝類型的差別是什麼?
包裝類型可以為null,而基本類型不可以。 這使得包裝類型可以用于POJO中,而基本類型則不行。
那為什麼POJO的屬性必須要用包裝類型呢?
資料庫的查詢結果可能為null,如果使用基本類型,因為要自動拆箱(将包裝類型轉為基本類型,比如從Integer對象轉為int),就會抛出NullPointerException異常。
包裝類型可用于泛型,基本類型不可以。泛型使用基本類型時會編譯出錯。因為泛型在編譯時會進行類型擦除,最後隻保留原始類型,而原始類型隻能是Object類及其子類,基本類型是個特例。
基本類型比包裝類型更高效。基本類型在棧中直接存儲的具體數值,而包裝類型則存儲的是堆中的引用。比起基本類型,包裝類型需要占用更多的記憶體空間。
那什麼是自動裝箱和自動拆箱?
從Java5中開始引入了自動裝箱/拆箱機制,把基本類型轉換成包裝類型的過程叫做裝箱;反之,把包裝類型轉換成基本類型的過程叫做拆箱,使二者可以互相轉換。
自動裝箱:把基本資料類型重新轉化為對象。成為一個對象之後就可以調用對象所聲明的所有的方法。
自動拆箱:将對象重新轉化為基本資料類型。
因為對象時不能直接進行運算的,而是要轉化為基本資料類型後才能進行加減乘除。