1. 程式人生 > >Java知識點模塊化(1)—— 面向對象

Java知識點模塊化(1)—— 面向對象

只需要 知識 pad 產生 自動裝箱 pri 生存 new 使用

前言

  這是我整理的Java筆記,分模塊會陸續上齊,具體鏈接如下:   1.面向對象:http://www.cnblogs.com/Gabby/p/6857406.html   2.集合:   3.IO:   4.多線程:   5.JVM:   6.其他知識點:序列化,泛型,註解,異常,反射:

1.面向對象

1.1 面向對象的三大特征

1.1.1 繼承

1)類的繼承 (1)基本定義 Java的繼承具有單繼承的特點,通過關鍵字extends實現。父類和子類的關系:一般和特殊的關系,子類是父類的一種特殊形式,例如水果和蘋果。 (2)重寫 當父類的方法無法滿足子類的方法時,需要重寫父類的方法,使用override進行重寫。 重寫步驟:兩同兩小一大 兩同:方法名相同 + 參數列表相同 兩小:子類返回值類型 <= 父類返回值類型 + 子類方法聲明拋出異常 <= 父類聲明拋出異常 一大:子類方法訪問權限 >= 父類方法訪問權限 (3)super 關鍵字 有兩個作用: 調用被子類重寫的父類的方法:當覆蓋方法是實例方法時,使用super;當覆蓋方法為類方法時,用父類類名。 子類調用父類的構造器:super用於限定該構造器初始化的是該對象從父類繼承得到的實例變量。如果是類變量,則使用父類類名。 (4)繼承的缺點: 會破壞父類的封裝性。子類可以直接訪問父類的成員變量和方法,從而造成子類和父類的嚴重耦合。 (5)設計父類需要滿足的規則
  • 盡量隱藏父類的內部數據,盡量將成員變量設置成private;
  • 不要讓子類隨意訪問,修改父類的方法。父類作為輔助的工具方法應用private修飾;父類方法需要外部類訪問,則使用public修飾;父類方法需要子類重寫,則使用protect修飾;
  • 盡量不要在父類構造器中調用將被子類重寫的方法。
(6)派生子類需要滿足的條件
  • 子類是一種特殊的父類,需要滿足"子類 is 父類"的關系;
  • 子類需要額外增加屬性,而不僅僅是屬性值的改變
  • 子類需要增加自己獨有的行為方式(包括新增方法或重寫父類的方法)
2)組合 實現類復用的手段:繼承和組合。 (1)組合定義 將該類當成另一個類的組成成分,從而允許新類直接復用該類的public方法。組合把舊類對象作為新類的成員變量組合進來,用以實現新類的功能,通常需要在新類裏使用private修飾被組合的舊類方法。 (2)繼承和組合的區別
  • 繼承是對已有的類的一番改造,以此獲得一個特殊的版本。就是將一個較為抽象的類改為一個滿足特殊需求的類;繼承表達的是"is a "的關系。
  • 組合表達的是整體和部分的關系,表達的是"has a " 的關系。

1.1.2 封裝

1. 定義 將對象狀態信息隱藏在對象內部,不允許外部程序直接訪問對象內部信息,而是通過該類所提供的方法來實現對內部信息的操作和訪問。 2. 良好的封裝需要滿足: 將對象的成員變量和實現細節隱藏起來,不允許外部直接訪問; 把方法暴露出來,讓方法來控制對這些成員變量進行安全的訪問和操作。 3. 訪問控制符
private default protect public
同一個類中
同一個包中
子類中
全局範圍內
1.1.3 多態 1.定義 編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定。如果編譯時類型和運行時類型不一致,就可能出現了所謂的多態。多態:相同類型的變量,調用同一個方法呈現出不同的行為特征。對象的實例變量不具備多態性。 2.編譯時多態:方法重載 3.運行時多態:方法重寫

1.2 類

1.2.1 類的構成

1)成員變量 (1)定義 在類中定義的變量。分為實例變量(不以static修飾的)和類變量(以static修飾的)。 (2)類變量 類變量使用static修飾,是從該類的準備階段起開始存在,直到系統完全銷毀這個類,類變量的作用域與這個類的生存範圍相同; (3)實例變量 實例變量則從該類的實例被創建起開始存在,知道系統完全銷毀這個實例,實例變量的作用域與對應實例的生存範圍相同。 (4)成員變量的內存運行機制 當系統第一次使用一個類時會加載這個類並初始化這個類,在類的準備階段,系統將會為該類的類變量分配內存空間並指定默認初始值。當類初始化完成後,系統會為該類分配一塊內存區,該內存區包含了類變量的內存,當系統創建一個對象時,實例變量是在創建實例時分配內存空間並指定初始值的。 (5)局部變量的初始化和內存中的運行機制 局部變量是在方法中定義的變量。局部變量定義後,必須經過顯式初始化後才能使用,系統不會為局部變量執行初始化,局部變量總是保存在其所在方法的棧內存中。如果局部變量是基本類型的變量,則直接把這個變量的值保存在該變量對應的內存中;如果局部變量是引用類型的變量,則這個變量裏存放的是地址,通過該地址引用到堆中該變量實際引用的對象或數組。 棧內存中的變量無須系統垃圾回收,往往隨著方法或代碼塊的運行結束而結束。 2)方法 (1)方法的所屬性 static修飾的方法屬於類;沒有static修飾的方法屬於對象。 (2)java中的參數傳遞機制: 只有一種傳遞方式:值傳遞。將實際參數值的副本傳入方法內,而參數本身不會受任何影響。當傳遞的是基本類型的時候就傳遞值;當為對象時,則傳遞對象的引用地址值。 (3)方法重載:兩同一不同 兩同:同一類中 + 方法名相同 一不同:參數列表不同。 3)構造器 (1)定義 特殊的方法,用於創建實例時執行初始化。初始化塊是構造器的補充 (2)構造器重載 使用this關鍵字調用本類的構造器 4)初始化塊 (1)定義 對Java對象進行初始化操作。 定義方法: [修飾符] { //初始化塊的可執行代碼 } 修飾符只能是static. (2)靜態初始化塊:使用static修飾的初始化塊。用於對整個類進行初始化處理,一般是對類變量執行初始化處理。 (3)類的初始化階段: 類初始化: 執行最頂層父類的靜態初始化塊 ...... 執行子類的靜態初始化塊 對象初始化: 執行最頂層父類的初始化塊 執行最頂層父類的構造器 ...... 執行子類的初始化塊 執行子類的構造器

1.3 不可變類

1.定義 創建該類的實例後,該實例的實例變量是不可改變的。包裝類,java.lang.String都是不可變類。 2.創建自定義的不可變類規則: (1)使用private和final修飾該類的成員變量 (2)提供帶參構造器,用於根據傳入參數來初始化類裏的成員變量 (3)僅為該類的成員變量提供getter方法 (4)如果有必要的話,重寫Object類裏的equals和hashcode方法 3.String不可變類的好處 (1)只有當字符串是不可變時,字符串池才有可能實現,字符串池的實現可以在運行時節約很多堆空間,因為不同的字符串變量都指向池中的同一個字符串。 (2)因為字符串是不可變的,所以是線程安全的。 (3)類加載器要用到字符串,不可變類提供了安全性,以便被正確的類加載 (4)因為字符串是不可變的,所以在它創建的時候hashcode被緩存,不需要重新計算。

1.4 抽象類和接口

1.4.1 抽象類

(1)定義 某一個父類只知道其子類應該包含怎樣的方法,但無法準確地知道子類如何實現這些方法。只有方法簽名,沒有方法實現。抽象類和抽象方法使用abstract修飾。抽象類中可以沒有抽象方法。 (2)使用規則
  • 抽象類和抽象方法必須用abstract修飾,抽象方法不能有方法體。
  • 抽象類不能實例化,無法用new來調用抽象類的構造器創建實例
  • 抽象類可以包含成員變量,方法(普通方法和抽象方法都可以),構造器,初始化塊,內部類(接口,枚舉)5種成員,主要用於其子類調用
  • 含有抽象方法的類只能定義成抽象類

1.4.2 接口

(1)定義 抽象類的特殊形式,接口不能包含普通方法,接口中所有方法都是抽象方法。使用interface修飾 (2)特征
  • 修飾符:可以用public或省略,省略則默認采用包權限訪問控制符。
  • 一個接口可以繼承多個父接口,但接口只能繼承接口,不能繼承類。
  • 接口中不能包含構造器和初始化塊定義;接口中可以包含成員變量(只能是靜態變量),方法(只能是抽象實例方法,類方法或者默認方法),內部類(包含內部接口,枚舉);
  • 靜態常量會自動添加static final 修飾符;
  • 接口中的方法只能用public修飾,不能有實現。類方法和默認方法必須有實現。
(3)作用:被類實現,implements.

1.4.3 抽象類和接口的區別

(1)設計目的
  • 接口是多個模塊間的耦合標準,類似於系統的“總綱”;
  • 抽象類作為系統中多個子類的共同父類,它所體現的是一種模板式設計。可以當做中間產品,這個中間產品已經實現了系統的部分功能,但是不能當成最終產品。
(2)用法的不同
  • 方法:接口只能包含抽象方法,靜態方法和默認方法,不能為普通方法提供實現;抽象類完全可以包含抽象方法。
  • 變量:接口中只能定義靜態變量,不能定義普通成員變量;抽象類中既能定義靜態變量,也能定義普通成員變量。
  • 構造器:接口中不能包含構造器;抽象類中能包含構造器。
  • 初始化塊:接口中不能包含初始化塊;抽象類中能包含初始化塊。
  • 一個類只能單繼承;一個接口能多繼承。

1.5 內部類

(1)定義 定義在一個類內部的類。 (2)作用
  • 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類;
  • 內部類可以直接訪問所在類的外部類的私有數據;外部類不能訪問內部類的實現細節;如果外部類需要訪問非靜態內部類的成員,則必須顯示創建非靜態內部類對象來調用訪問實例成員。
  • 匿名內部類適合於創建那些僅需一次使用的類。
(3)特性 內部類的修飾符可以用private,protected,static.內部類上一級是類,有4個作用域:同一個類(private),同一個包(不使用),父子類(protected),任何位置(public)。 非靜態內部類不能擁有靜態成員。

1.5.1 靜態內部類

(1)定義 使用static修飾一個內部類,則這個內部類屬於外部類本身。 (2)特性
  • 靜態內部類既可以包含靜態成員,也可以包含非靜態成員;
  • 靜態內部類只能訪問外部類的靜態成員;
  • 靜態內部類寄生在外部類的類本身中,只持有外部類的類引用。
  • 靜態內部類是外部類的一個靜態成員,因此外部類的所有方法,初始化塊都可以使用靜態內部類來定義變量,創建對象等。
  • 外部類可以使用靜態內部類的類名作為調用者來訪問。

1.5.2 局部內部類

定義在方法中 局部內部類不能使用訪問控制符和static修飾符修飾

1.5.3 匿名內部類

(1)定義 適合創建只需要一次使用的類。 (2)規則
  • 匿名內部類必須繼承且最多只能繼承一個父類或實現一個接口;
  • 匿名內部類不能是抽象類,不能定義構造器。
(3)創建方法 需要創建某個接口類型的對象: new 實現接口| 父類構造器{ 類體部分 }

1.6 關鍵字

1.6.1 static

(1)作用 用於區分成員變量,方法,內部類,初始化塊這四種成員屬於類本身還是屬於實例。 (2)特征 static修飾的成員不能訪問沒有static修飾的成員; static修飾成員則表明它屬於這個類本身,稱為類變量或者類方法;

1.6.2 this 與 super

(1)this 作用:指向調用該方法的對象。讓類中的一個方法去訪問該類的實例變量或方法。 用法:在構造器中使用表示引用該構造器正在初始化的對象;在方法中引用表示調用該方法的對象。 (2)super 使用:在子類中調用父類被覆蓋的實例方法;super用於構造器表示該構造器初始化的是該對象從父類繼承得到的實例變量。 (3)this 和 super的區別 super調用其父類的構造器;this調用同一類中重載的構造器。 1.6.3 final (1)定義 表示不可以改變,不希望子類繼承父類的某一個方法。 (2)作用 用於修飾類,變量和方法,用以表示類,變量和方法不可變,一旦賦初始值就不能改變。 (3)用法 修飾成員變量:類變量:必須在靜態初始化塊或者在聲明時指定初始值;實例變量:必須在非靜態初始化塊或者聲明變量或者構造器中使用; 修飾局部變量:聲明時指定初始值。 (3)特性
  • 用final修飾的成員變量需要在聲明處或者構造器或者初始化塊進行賦值;必須由程序員顯式地指定初始值。
  • final修飾基本類型需要值保持不變,不可以重新賦值;final修飾引用類型只需要地址保持不變,可以改變引用類型變量所引用對象的內容。
  • final方法不希望子類重寫父類的某個方法,但是可以被重載;方法使用public則不可以重寫,使用private則可以定義一個一模一樣的方法。
  • final修飾的類不可以有子類。

1.7 其他

1.7.1 包裝類

(1)來源 為8種基本數據類型分別定義了相應的引用類型。類名是基本類型的第一個字母大寫。包裝類的實例是引用類型。為什麽要裝箱:因為面向對象的思想,萬物皆是對象 (2)自動裝箱和自動拆箱 自動裝箱:一個基本類型可以直接賦給對應的包裝類變量或者賦值給Object變量 自動拆箱:允許直接把包裝類對象賦給給定的基本類型變量。 (3)特性 Integer:系統把-128~127之間的整數自動裝箱成Integer實例,並放入名為cache的數組中緩存起來。

1.7.2 String,StringBuffer,StringBuilder

String:字符序列不可變;會產生很多 StringBuffer:字符序列可變,線程安全但性能不高;使用synchronized. StringBuilder:字符序列可變,線程不安全但性能略好

1.7.3 == 和 equals

==:基本類型且是數值類型,值相同返回true;引用類型對象指向同一個對象時返回true; equals:常量池中字符串相同返回true.

Java知識點模塊化(1)—— 面向對象