面向对象(OOP)
文章目錄
- 1. 概念
- 2. 包
- 3. 訪問控制
- 4. 方法(函數)中參數傳遞的方式
- 5. 面向對象的特點
- 6. 構造器特點
- 7. 繼承
- 7.1. 繼承設計技巧
- 8. 多態
- 8.2. 重載(Overload)
- 8.3. 覆蓋(重寫Override)
- 9. this、super 與 finally關鍵字
- 10. 對象包裝器與自動裝箱/拆箱
1. 概念
- 面向對象(Object Oriented Programming)程序由對象組成,每個對象對用戶公開特定功能并隱藏代碼實現的部分,其中很多的對象來自Java標準庫,也存在一部分對象是開發者自定義,只要當前對象能夠滿足要求,就不必去關心其功能具體是如何實現的。
- 對象包含數據(屬性) 和 函數(動作)
- 面向對象將數據放在第一位,再去考慮操作數據的算法,操作數據的過程也就被稱為方法。
- 對象之間的聯系通過消息傳遞實現,也就是函數調用。
- 類是構建對象的模板,由類構造對象的過程稱為創建類的實例。創建時使用構造器(構造函數)創建新實例(對象),如果希望構造的對象可以多次使用,那么就會將對象存放在一個變量中,如果聲明為一個對象變量,那么它就可以引用后面構造器所構造的對象。
- 對象具有唯一性
2. 包
- Java使用包將類組織在一個集合中,也是確保類名唯一性的主要原因,同名類放置在不同包中就不會產生沖突,為了保證包名的唯一性,一般使用因特網域名的逆序來進行命名。
3. 訪問控制
- 缺省(default),同一個包中可見
- private,在本類中可見
- protected,在子類中可見
- public,在任何情況都可見
4. 方法(函數)中參數傳遞的方式
- Java對對象采用按值調用并不是按引用調用,實際上對象的引用就是按值傳遞的。
5. 面向對象的特點
核心思想,絕不能讓其他類直接訪問實例字段,程序只能通過對象的方法與對象進行數據交互。
類與類之間的關系,可以基于已存在的類派生新的類,并復用繼承的已存在父類的方法
一個對象變量可以指示出多種實際類型的現象,例如一個類中的方法和屬性被繼承后會有不同的數據類型或行為
6. 構造器特點
7. 繼承
- 父類也被稱為超類、基類;子類也被稱為派生類、孩子類。
- 一般情況下子類比父類擁有的功能會更多,如果在子類中定義了與父類簽名相同的方法,那么這個方法就會覆蓋父類中擁有相同簽名的方法。
- 子類方法不能低于父類方法的權限。
- Object類:所有類的父類,Java中每個類都擴展了Object類,包括基本數據類型,因為基本數據類型都有一個與之對應的類(并且除了Boolean其它六個類還有一個公共的父類Number)稱為包裝器,自然Object類型的變量可以引用所有類的對象 ,當然,Object類引用子類對象只是作為一個泛型容器,要想對子類對象進行相應的操作還是要用強制類型轉換來進行。
7.1. 繼承設計技巧
8. 多態
- 對象變量是多態的,一個父類對象既可以引用一個父類對象,也可以引用子類的對象。
8.2. 重載(Overload)
發生在同一個類中
這里注意,重載是靜態的,在這里只是實現多態的一種方式,它并不屬于多態,也不屬于面向對象
-
類可能有多個同名的方法,包括構造方法,它們有相同的方法名,但是卻有不同的參數,這時就會根據函數參數傳遞的參數類型進行匹配,選擇適合的相同參數類型的方法。因此要完整的描述一個方法就需要展示其相同方法名以及不同的參數類型,這就叫做方法的簽名。
-
對于構造方法,僅當當前類中沒有其它有參構造函數時才會得到一個默認的無參構造器,但是只要有一個有參構造函數,但是卻沒自定義一個無參構造器的話就必須給定有參的初始值。
8.3. 覆蓋(重寫Override)
發生在父子類中
- 子類繼承父類后對父類方法進行重新編寫。
靜態方法為了區分一般使用類名進行調用,而不是使用與它無直接關系的對象進行調用,雖然也可以,這只是一個建議,常見的例如工廠方法。當然靜態方法也可以直接進行調用而不需要任何對象,例如main方法。
9. this、super 與 finally關鍵字
- this 關鍵字有兩個含義,一是指向當前對象(隱式參數)的引用,二是調用該類的其他構造器。this可以調用本類對象所有的方法與屬性,用來區分成員變量與局部變量的重名問題。this();指向本類的構造方法,只能寫在構造方法中并且必須是第一句。
- super 關鍵字也有兩個含義,一是調用超類的方法,二是調用超類的構造器。super可以調用超類對象所有的方法與屬性,super();指向父類的構造方法,只能在子類構造方法的第一條語句出現,以便參數可以傳遞到另一個構造器。
- final
- 修飾類后不可被繼承
- 修飾方法后子類不能再進行覆蓋,但是可以重載
- 修飾變量后就變為常量,不可再更改它的值
- 局部、匿名內部類只能訪問局部final修飾的變量,因為怕外部類銷毀或變動后還要訪問外部變量
10. 對象包裝器與自動裝箱/拆箱
拆箱與裝箱是編譯器要做的工作,而不是虛擬機的工作,虛擬機用來執行編譯器生成的字節碼。
ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(10);arrayList.add(Integer.valueOf(10));if (arrayList.add(10) == arrayList.add(Integer.valueOf(10))) {//兩者等價證明實現了自動裝箱System.out.println("true");} else {System.out.println("false");}System.out.println(arrayList.get(0).intValue());System.out.println(arrayList.get(1));//這里將一個Integer對象賦給一個int值就是自動拆箱int i = arrayList.get(0);System.out.println(i);靜態字段屬于類,并不屬于某個對象,對此類的所有對象進行共享,所以靜態方法沒有this參數的方法,也就是說它沒有隱式參數(方法名前所構造的對象),顯示參數指方法傳入的形參。
private static final或構造器定義的方法可以讓編譯器準確的知道是哪一個方法,這樣的行為稱為靜態綁定,而對象調用的方法虛擬機需要先計算方法表,稱為動態綁定。
最好將類中的字段定義為private方法定義為public。
總結
- 上一篇: 【转】125个常用拉丁语词根
- 下一篇: Excel 2010 SQL应用083