JavaSE基礎知識總結

1. 面向對象和麪向過程的區別

  • 面向過程

    • 優點:性能比面向對象要高,因爲類的實例化需要消耗大量的資源,通常用在嵌入式系統開發中
    • 缺點:代碼量太大,難維護,難擴展
  • 面向對象
    • 優點 易維護、易複用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護
    • 缺點 性能低於面向對象程序

2. Java語言的特點

  • 簡單、易學
  • 跨平臺
  • 面向對象
  • 分佈式
  • 健壯性
  • 支持多線程
  • 支持網絡編程
  • 支持編譯和解釋

3. JDK、JRE、JVM的關係

JDK是Java提供的開發工具包,除了包含Java程序運行的JRE外,還包含了一些提供給程序員使用的開發程序包
JRE是Java運行時環境
當我們通過JRE運行程序時,JVM將字節碼轉換成機器碼,JVM還提供了內存管理、垃圾回收和安全機制,獨立於操作系統和硬件,也是Java跨平臺的原因

4. Java是解釋執行,這句話正確嗎?

Java是一門面向對象的語言,最顯著的特性有兩個方面,一是跨平臺性,二是垃圾收集。Java通過垃圾收集器回收分配內存,所以我們不需要手動管理內存。對於Java是解釋執行這句話,這個說法不太準確。我們開發的Java源代碼,通過javac編譯成字節碼文件,然後,在運行時通過JVM內嵌的解釋器將字節碼轉換成機器碼,但是常見的JVM都提供了JT編譯器,也就是通常所說的動態編譯器,JT能夠在運行時將熱點代碼編譯成字節碼,這種情況下部分熱點代碼就屬於編譯執行,而不是解釋執行了

5. Java和C++的區別

  • 都支持面向對象三大特性
  • C++支持多繼承,Java不支持多繼承,但是接口可以多實現
  • Java不提供指針操作,程序更加安全
  • Java有內存管理,不需程序員手動分配釋放內存

6. 重載和重寫的區別

  • 重載:處於同一個類中,方法名相同,返回值,參數個數和類型都可以不相同
  • 重寫:處於子類中,方法名,返回值,參數個數和類型都必須相同,構造器不可以被重寫

7. 面向對象三個特性

  • 封裝

    封裝就像對象的屬性進行私有化,同時提供一些方法提供給外界訪問

  • 繼承

    繼承是通過已存在的類創建新的類,繼承父類的非私有屬性和方法,我們可以使用父類繼承的屬性和方法,也可以添加一些屬性和方法,但是,不可以選擇性的繼承父類的屬性和方法

  • 多態

    所謂多態就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定
    在Java中有兩種形式可以實現多態:繼承和接口

8. 自動拆箱和裝箱

  • 裝箱 將基本類型用它們對應的引用類型包裝起來
  • 拆箱 將包裝類型轉換爲基本數據類型

9. 爲什麼在一個非靜態方法中調用靜態變量是非法的?

由於靜態方法可以不通過對象進行調用,因此在靜態方法裏,不能調用其他非靜態變量,也不可以訪問非靜態變量成員

10. 在 Java 中定義一個空參構造的作用

因爲子類在調用自己的構造方法之前,會調用父類的構造方法,如果沒有顯示的使用super調用父類的構造方法,就是隱式的調用父類的空參調用,如果父類中只有帶參構造,就會出現編譯出錯

11. 接口和抽象類的區別

  • 接口中的方法都是抽象方法,抽象類中的方法可以是抽象的,也可以不是抽象的
  • 一個類可以實現多個接口,但是只可以繼承一個抽象類
  • 一個類實現接口必須實現接口的中的所有方法,但是抽象不需要
  • 抽象的實例變量都是常量,抽象類不一定
  • 接口不能用 new 實例化,但可以聲明,但是必須引用一個實現該接口的對象 從設計層面來說,抽象是對類的抽象,是一種模板設計,接口是行爲的抽象,是一種行爲的規範

12. 成員變量和局部變量的區別

從語法形式上,成員變量是屬於類的,而局部變量是在方法中定義的變量或是方法的參數,成員變量可以被權限修飾符所修飾,而局部變量不能被訪問控制修飾符及static所修飾
成員變量和局部變量都能被 final 所修飾
從變量在內存中的存儲方式來看,成員變量是對象的一部分,而對象存在於堆內存,局部變量存在於棧內存
從變量在內存中的生存時間上看,成員變量是對象的一部分,它隨着對象的創建而存在,而局部變量隨着方法的調用而自動消失
成員變量如果沒有被賦初值,則會自動以類型的默認值而賦值而局部變量則不會自動賦值

14. 靜態方法和實例方法有何不同

靜態方法可以使用類名.方法名和實例名.方法名的方式調用,實例方法只能使用實例名.方法名的方式調用
靜態方法在訪問本類時,只允許訪問靜態方法和靜態成員,實例方法則沒有此限制

13. 創建一個對象用什麼運算符?對象實體與對象引用有何不同?

new運算符,new創建對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存放在棧內存中)。一個對象引用可以指向0個或1個對象,一個對象可以有n個引用指向它

15. String 和 StringBuffer、StringBuilder 的區別是什麼 String 爲什麼是不可變的?

String類使用final修飾,所以說String是不可變的,StringBuffer和StringBuilder繼承於AbstractStringBuilder類,這個類沒有被final修飾,所以這兩個類都是可變的

  • 線程安全:所謂線程安全,就是多個線程訪問的時候,我們的程序還能按照我們預期的行爲去執行,Stiring是不可變的,可以理解爲常量,所以String是線程安全的,StringBuffer增加了同步鎖,所以StringBuffer是線程安全的,StringBuilder是線程不安全的
  • 性能:因爲String是不可變的,所以每次修改對象都會在堆內存中創建一個新的對象,所以它的性能最低,StringBuffer是線程安全的,所以它的性能略低於StringBuilder
  • 總結:
    • 操作少量數據,使用String
    • 單線程操作大量數據,使用StringBuilder
    • 多線程操作大量數據,使用StringBuffer

16. 什麼是方法返回值?

返回值就是一個方法執行完成後返回的結果

17. 構造方法的作用?

構造方法的作用就是完成對實例的初始化操作,即使沒有自定義構造方法,這個類中也會自帶一個無參構造

18. ==和equals

==比較的是兩個對象的內存地址是否相同,而equals比較是兩個對象的值是否相同

19. hashCode 與 equals

  • hashCode

    hashCode() 的作用是獲取哈希碼,也稱爲散列碼,它實際上是返回一個int整數,這個哈希碼的作用是確定該對象在哈希表中的索引位置,Java中的任何類都包含有hashCode() 函數

    散列表存儲的是鍵值對,它的特點是:能根據“鍵”快速的檢索出對應的“值”,這其中就利用到了散列碼

  • 爲什麼要有 hashCode

    當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode 值作比較,如果沒有相符的hashcode,HashSet會假設對象沒有重複出現,但是如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同,如果兩者相同,HashSet 就不會讓其加入操作成功,如果不同的話,就會重新散列到其他位置,這樣我們就大大減少了執行equals的次數,相應就大大提高了執行速度

  • hashCode()與equals()的相關規定

    如果兩個對象相等,則hashCode一定也是相同的
    兩個對象相等,對兩個對象分別調用equals方法都返回true
    兩個對象有相同的hashCode值,它們也不一定是相等的
    因此,equals方法被覆蓋過,則hashCode方法也必須被覆蓋
    hashCode()的默認行爲是對堆上的對象產生獨特值,如果沒有重寫 hashCode(),則該 class 的兩個對象無論如何都不會相等

20. 異常

  • Java異常體系層次圖
    JavaSE基礎知識總結

    在 Java 中,所有的異常都有一個共同的祖先,Throwable類
    Throwable: 有兩個重要的子類
    Error:是程序無法處理的錯誤,表示運行應用程序中較嚴重問題,大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時JVM出現的問題
    Exception:是程序本身可以處理的異常,Exception 類有一個重要的子類

  • 編譯期異常和運行期異常的區別

    編譯器異常是指編譯器要求必須處理的異常,即程序在運行時由於外界因素造成的一般性異常,編譯器要求必須捕獲或聲明所有編譯期異常
    運行時異常是指編輯器不要求強制處理的異常,一般是程序的邏輯錯誤,對於這類異常,可以不做處理,若全部處理可能會對程序的可讀性和運行效率產生影響

  • 異常和錯誤的區別

    異常能被程序本身可以處理,錯誤是無法處理

  • Throwable類常用方法

    public string getMessage():返回異常發生時的詳細信息
    public string toString():返回異常發生時的簡要描述
    public string getLocalizedMessage():返回異常對象的本地化信息,使用Throwable的子類覆蓋這個方法,可以聲稱本地化信息,如果子類沒有覆蓋該方法,則該方法返回的信息與getMessage返回的結果相同
    public void printStackTrace():在控制檯上打印Throwable對象封裝的異常信息

  • 異常處理總結

    try塊:用於捕獲異常。其後可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊
    catch塊:用於處理try捕獲到的異常
    finally塊:無論是否捕獲或處理異常,finally塊裏的語句都會被執行,當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行

  • 在以下4種特殊情況下,finally塊不會被執行

    在finally語句塊中發生了異常
    在前面的代碼中用了System.exit()
    程序所在的線程死亡
    關閉CPU

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章