Java學習基礎與總結二

1.Java面向對象編程的三大特性,封裝、繼承和多態。

  • 封裝:封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性方法。
  • 繼承:繼承是使用已存在的類的定義作爲基礎建立新類的技術,新類的定義可以增加新的數據或功能,也可以用父類的功能,但不能選擇性地繼承父類。通過繼承可以非常方便的複用代碼。
    • 子類擁有父類對象的所有屬性和方法(包括私有屬性和私有方法),但是父類中的私有屬性和方法子類無法訪問。
    • 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展
    • 子類可以用自己的方式實現父類的方法(重寫)
  • 多態:多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量的方法調用發出的方法調用在編程時並不確定。而是在程序運行期間才確定,即一個引用變量到底會指向那個類的實例對象,該引用變量發出的方法調用到底是哪個類實現的方法,必須在程序運行期間才能決定。
    多態的兩種實現方式:
    • 繼承:多個子類對同一方法的重寫。
    • 接口:實現接口並覆蓋接口中的同一方法。

2.String、StringBuffer和StringBuiled的區別是什麼?

  • 可變性:
    • String類中使用final關鍵字修飾字符數組來保存字符串:privat final char value[];,所以String是不可變的。Java9之後,String類的實現改用byte數組來存儲字符串private final byte[] value;
    • StringBuilder和StringBuffer都繼承自AbstractStringBuilder類。在AbstractStringBuilder中,也是使用字符數組保存字符串char[] value;但是沒有使用final關鍵字修飾,所以這兩種對象是可變的。
  • 線程安全性:
    • String中的對象是不可變的,也就可以理解爲常量,線程安全。
    • StringBuffer對放方法加了同步鎖或者對調用的方法加了同步鎖,線程安全。
    • StringBuilder沒有對方法進行加同步鎖,線程非安全。
  • 性能:
    • String對象每次改變的時候,都會生成一個新的String對象,然後將指針指向新的String對象;而StringBuffer和StringBuilder每次都對對象本身操作。相比之下String性能低。
    • StringBuffer對方法進行加鎖操作。相比於StringBuilder降低了性能,但是獲得了線程安全。
    • StringBuilder > StringBuffer > String
  • 總結:
    • String:適合操作少量的數據。
    • StringBuilder:適合單線程操作字符串緩衝區下操作大量數據。
    • StringBuffer:適合多線程操作字符緩衝區下操作大量數據。

3.裝箱與拆箱

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

4.在一個靜態方法內調用一個非靜態成員爲什麼是非法的?

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

5.在Java中定義一個不做任何事且沒有參數的構造方法的作用?

Java程序在執行子類的構造方法之前,如果沒有用super()來調用父類特定的構造方法,則會調用父類中“沒有參數的構造方法”.。因此,如果父類中只定義了有參構造,而在子類中的構造方法中又沒有用super()來調用父類中的構造方法,則編譯時會發生錯誤,因爲Java在父類中找不到沒有參數的構造方法可供執行。解決方法便是在父類裏面加上一個無參構造。

6.java和javax有什麼區別?

  • 一門語言的進行發展中的拓展。
  • 最初時期JavaAPI必須的包都是java開頭,javax是作爲拓展API使用。隨着時間的推移,javax逐漸成爲Java API的組成部分。將javax轉移到java中的代價太麻煩,所以直接將javax作爲標準API的一部分。

7.接口和抽象類的區別是什麼?

  • 接口的方法默認是public,並且在接口中不能有實現。而抽象類可以有非抽象方法。(java8開始,接口方法可以有默認實現。)
  • 接口中除了static和final變量,不能有其他變量。抽象類中不固定。
  • 一個類可以實現多個接口,只能實現一個抽象類,接口本身也可以通過extends拓展多個接口。
  • 接口方法的默認修飾符是public,抽象方法可以有public、protected和default修飾符,抽象方法是用來被重寫的所以不可以使用private修飾。
  • 設計層面講:抽象是對類的抽象,是模板設計;接口是對行爲的抽象,是行爲規範。

8.成員變量與局部變量的區別有哪些?

  • 語法形式:
    • 成員變量是屬於類的。局部變量是在方法中定義的變量或方法的參數;
    • 成員變量可以被public、private和static修飾。局部變量不能被訪問修飾符和static修飾。
    • 都可以被final修飾。
  • 內存上的存儲方式:
    • 如果成員變量使用static修飾,那麼它屬於類的。如果沒有使用static修飾,它是屬於實例的。
    • 對象存在於堆內存,局部變量存在於棧內存。
  • 內存上的生存時間:
    • 成員變量是對象的一部分,隨着對象的創建而存在。
    • 局部變量隨着方法的調用而消失。
  • 初始化:
    • 成員變量如果沒有使用final修飾,那麼會自動以類型的默認值賦值。
    • 局部變量不會自動賦值。

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

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

10.什麼是方法的返回值,返回值在類的方法中的作用是什麼?

  • 方法的返回值是指獲取某個方法體中代碼執行後產生的結果。
  • 作用:接收處理的結果,使得可以用於其他操作。

11.一個類的構造方法有什麼作用,若一個類沒有聲明構造方法,該程序能正確執行嗎?爲什麼?

  • 作用:完成對象的初始化工作。
  • 沒有聲明構造也可以執行。
  • 即使沒有聲明構造方法,也會有默認的無參構造。

12.構造方法有哪些特性?

  • 名字和類名相同
  • 沒有返回值,也不能使用void
  • 生成類的對象自動執行,無需調用

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

  • 調用方式:靜態方法無需創建對象便可以訪問;可以使用“類名.方法名”調用,也可以使用“對象名.方法名”調用.而實例方法只能使用“對象名.方法名”。
  • 訪問權限:靜態方法在訪問本類的成員(成員變量和成員方法)時,只能訪問靜態成員,而不能訪問實例成員。實例方法沒有限制。

14.對象的相等於指向他們引用相等有什麼不同?

  • 對象的相等,比較的是內存中存放的內容是否相等。
  • 引用的相等,比較的他們指向的內存地址是否相等。

15.在調用子類構造方法之前會先調用父類的無參構造,目的是?

幫助子類做初始化工作

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