Java面向對象

封裝

靜態變量:

  • static是描述靜態變量的方法,static String country;可使變量從對象層級上升到類層級,整個類中只有一份,並且被所有對象共享。該變量隨着類的加載而準備就緒,與是否建立對象無關。

靜態方法

  • 靜態方法能夠不用建立對象,直接使用類名.的方式調用。

代碼塊與靜態代碼塊

  • 代碼塊介於成員變量與成員方法之間,代碼塊內的內容隨着對象的初始化而初始化。
  • 靜態代碼隨着類的加載而加載,在類中只初始化一次。

靜態代碼塊的初始化優先級最高java

封裝

封裝的意義:

  • 一般狀況下能夠再測試類中給成員賦值一些合法可是不合理的內容,爲了不這些錯誤的發生,須要對成員變量進行封裝,來隱藏成員變量的細節,保證成員變量的合法性,這個機制叫作封裝。

封裝的流程

  • 使用private關鍵字修飾成員變量進行私有化操做。
  • 提供公有的get和set方法來訪問私有成員變量,並在方法體內部進行合理化判斷。
  • public關鍵字修飾後的變量或者方法是公有屬性。
  • 沒有修飾符修飾的變量或方法叫作默認的訪問權限,級別介於private與public之間。

實例:在Singleton類中定義一個對象,使得SingletonTest中main方法只能獲得該類的一個對象

  1. 在Singleton中定義一個private修飾的私有Singleton構造方法。
  2. 聲明本類型的引用指向本類型的對象,使用private和static修飾。
  3. 提供公有的get方法返回這個對象,使用public和static關鍵字修飾,使得可以在測試中使用類名.方法的方式來訪問。Singleton s1 = Singleton.getInstance;

單例設計模式

  • 在某些特殊場合中,一個類對外提供且只提供一個對象時,這樣的類叫作單例類,而設計單例的流程和思想被稱做單例設計模式。
  1. 私有化構造方法,使用private關鍵字修飾。
  2. 聲明本類類型的引用指向本類類型的對象,並使用private和static關鍵字共同修飾。
  3. 提供公有的get方法返回這個對象,並使用public和static關鍵字共同修飾。
  • 單例設計模式分爲餓漢式和懶漢式。

餓漢式

  • 類的開始馬上初始化對象

懶漢式

  • 類的開始建立一個空引用,後續判斷是否爲空,若爲空在指向對象。
  • 在調用方法時纔開始執行判斷。

繼承

繼承的概念

  • 當多個類之間有相同的特徵和行爲時,能夠將相同的內容提取出來組成一個公共類,讓多個類吸取公共類中已有的特徵和行爲而在多個類中只要編寫本身獨有的特徵和行爲的機制叫作繼承。
  • java中使用extends關鍵字來表示繼承。extends(擴展)後面的類叫作父類,超類,基類。前面的類叫作子類,派生類,孩子類。
  • 還用繼承提升了代碼的複用性,可維護性與擴展性,是多態的前提條件。

繼承的特色

  • 子類不能繼承父類的構造方法與私有方法。私有成員變量能夠被繼承可是不能直接訪問。
  • 不管使用何種方式構造子類的對象時,都會自動調用父類的無參構造方法來初始化從父類中繼承的成員變量,至關於在構造方法的第一行增長代碼super()的效果。
  • 使用繼承必須知足邏輯關係 : 子類 is a 父類,也就是不能濫用繼承。
    Java中只支持單繼承,不支持多繼承,也就是說一個子類只能有一個父類,可是一個父類能夠有多個子類。

方法的重寫

  • 當父類中繼承的方法不知足子類的需求時,就須要在子類中從新寫一個和父類同樣的方法來覆蓋從父類中繼承下來的版本,該方法就叫作方法的重寫(Override)。
    @Override是註解,若是下面的代碼沒有構成重寫則報錯。
    子類重寫方法後,同類下調用的都是重寫後的版本,

方法重寫的原則

  • 要求方法名相同,參數列表相同以及返回值類型相同。Java5之後能夠返回子類的類型。
  • 要求方法的訪問權限不能變小,能夠變大或者相同。
  • 要求方法不能拋出更大的異常。

權限修飾符

修飾符 本類 同包中的類 子類 其餘類
public 能夠訪問 能夠訪問 能夠訪問 能夠訪問
protected 能夠訪問 能夠訪問 能夠訪問 不能訪問
默認 能夠訪問 能夠訪問 不能訪問 不能訪問
private 能夠訪問 不能訪問 不能訪問 不能訪問

final關鍵字

  • final關鍵字能夠修飾類,成員方法以及成員變量。
  • final關鍵字修飾的類表示在該類沒法被繼承,防止濫用繼承。
  • final關鍵字修飾的方法能夠被繼承可是不能夠被重寫。防止不當心重寫方法。
  • final關鍵字修飾的變量必須初始化而且不可被修改。初始化方法有三種,顯示初始化,構造塊初始化,構造方法體初始化。
  • 建立一個常量,一般與public static共同使用,常量的命名規範是全部字母都要大寫,不一樣的單詞之間採用下劃線連接。

多態

多態的概念

  • 同一種事物表現得多種形態。

多態的語法格式

  • 父類類型 引用變量名 = new 子類類型();
    多態中會使用子類重寫後的方法。編譯階段使用父類的方法。

多態的特色

  • 當父類類型的引用指向子類類型的對象時,父類類型的引用能夠直接調用父類獨有的方法。
    若是父類類型的引用直接調用子類的獨有方法會報錯,由於在編譯階段是使用父類的方法。
  • 對於父子類都有的非靜態的方法,編譯階段使用父類的版本,運行階段使用重寫後的版本(動態綁定)
  • 靜態方法的調用只取決於繼承自那個類,與指向對象的類型無關。

多態的實際意義

  • 多態的實際意義在於屏蔽不一樣子類的差別性實現通用的編程帶來不一樣的效果。

多態的使用場景

  • 經過參數傳遞造成了多態
  • 直接在方法體中使用抽象類的引用指向子類類型的對象

數據類型轉換

  • 若是父類仍然須要調用子類的獨有方法,須要將父類類型的引用強制轉換爲子類類型的引用。(可能會拋出異常,父類轉換子類會爲任意非null值生成ClassCastException)
  • 引用數據類型必須發生在父子類之間。必須發生繼承關係
  • 若轉換的目標類型並非該引用真正指向的數據類型則編譯經過,運行階段拋出類型轉換異常。
    爲了不上述錯誤的發生,須要判斷,if(引用變量 instanceof數據類型)

抽象方法的概念

  • 抽象方法指不能具體實現的方法而且使用abstract關鍵字修飾,也就是沒有方法體。
  • 訪問權限 abstract 返回值類型 方法名(形參列表);

抽象類的概念

  • 抽象類主要指不能具體實例化的類而且使用abstract關鍵字修飾,也就是不能建立對象。由於抽象方法沒有方法體,調用該方法沒有意義,因此對建立對象做出限制。
  • 只有抽象類才能包含抽象方法。所以真正意義上的抽象類應該是具備抽象方法而且使用abstract關鍵字修飾的類。
    抽象類中能夠有成員變量,構造方法,成員方法。
  • 抽象類的意義在於被繼承。
  • 當一個類繼承抽象類後必須重寫抽象方法,不然該類也變成抽象類,也就是抽象類對子類具備強制性和規範性,所以被稱爲模板設計模式。

抽象類與接口的區別

  • 抽象類中能夠有成員方法,接口中只能有抽象方法
  • 抽象類中增長方法時子類能夠不用重寫,接口中增長方法時實現類須要重寫(java8以前的版本)。
    從java8開始增長新特性,接口中容許出現非抽象方法和靜態方法,但非抽象方法須要使用default關鍵字修飾。
  • 從Java9開始增長新特性,接口中容許出現私有方法。

接口

  • 接口是比抽象類還抽象的類,全部的方法都是抽象方法。
    定義關鍵字是interface。 只能擁有常量,默認使用public,static,final共同修飾。
  • 從jdk1.9\Java9開始,容許接口中出現私有方法。
  • 使用implements實現多個接口
名稱 關鍵字 關係
類與類之間的關係 使用extends表達繼承關係 單繼承
類與接口之間的關係 使用implements關鍵字表達實現關係 多實現
接口與接口之間的關係 使用extends表達繼承關係 多繼承

特殊類

內部類

  • 當一個類的定義出如今另一個類的類體中時,那麼這個類叫作內部類,而這個內部類所在的類叫作外部類。

實際意義

  • 當一個類的存在價值僅僅是爲了服務某一個類,那麼能夠將這個類定義爲內部類,這樣能夠隱藏該類的實現細節,而且能夠方便訪問外部類的私有成員而不用使用get和set方法。

內部類的分類

  • 普通內部類,能夠定義成員變量,成員方法以及構造方法等,可使用final或者abstract關鍵字修飾。可使用private或者protected關鍵字修飾。建立對象須要使用外部類的對象來建立對象。若是內部類訪問外部類中與本類內部同名的成員變量或者方法時,須要使用this關鍵字。編程

  • 靜態內部類 使用static修飾,屬於類層級。不能直接訪問外部類的非靜態成員,靜態內部類能夠直接建立對象,若是靜態內部類訪問外部類中與本類內同名的變量或方法時,須要使用類名.的方式訪問。設計模式

  • 局部內部類,將類的定義放在方法體內部。只能在該方法內部使用,能夠再內部直接建立對象,不能使用訪問控制符與static等修飾符。可使用外部方法的局部變量,但必須是final的。因爲聲明的週期不一致所致。從Java8開始,局部變量若是沒有修飾且被內部類使用,則默認爲final的。ide

  • 匿名內部類 沒有名字的內部類重點
    接口/父類類型 引用變量名= new 接口/父類類型(){方法的重寫};
    Java8出現了lamda表示式簡化上述代碼 (參數列表)-> {方法體}測試

  • 語法規則
    訪問修飾符 class 外部類的類名{
    訪問修飾符 class 內部類的類名{
    內部類的類體;
    }
    }this

訪問修飾符 class 外部類的類名{
訪問修飾符 返回值類型 成員方法名(形參列表){
class 內部類的類名{
​ 內部類的類體;
​ }
​ }

​ }設計

回調模式

回調模式的概念

  • 回調模式是指若是一個方法的參數是接口類型,則在調用該方法時,須要建立並傳遞一個實現此接口類型的對象;而該方法在運行時會調用到參數對象中所實現的方法(接口中定義的)。

枚舉

  • 基本概念:事物的取值只有固定的幾個值,此時描述這些事物的全部值能夠一一列舉出來,而列舉出來的類型就叫作枚舉類型。枚舉類型是Java5開始增長的一種引用數據類型,使用enum關鍵字定義。
  • 枚舉值就是當前類的類型,也就是指向本類的對象,默認使用public static fianl共同修飾,所以採用枚舉類型.的方式調用。
  • 枚舉類中能夠自定義構造方法,可是構造方法的修飾符必須是private,默認也是私有的。
public enum DirectionEnum{
	UP("向上"),DOWN("向下"),LEFT("向左"),RIGHT("向右");
       private final String desc;  //用於描述方向字符串的成員變量
    //私有化構造方法
       private DirectionEnum(Sring desc){
           this.desc = desc;
       }
    //提供公有的get方法返回內部的數值
       public String getDesc(){
           return desc;
       }

}code

相關文章
相關標籤/搜索