前言:java面向對象中的知識可以說是整個java基礎最核心的部分,不知不覺已經學完快2個月了,是時候復習一波了,剛開始學習的時候被繞的很懵逼,這次總結完畢之后有了很多新的感悟...
================================================================================================================================================
1,什么是類?什么是對象?
簡單來說,類是抽象出某一類事物的行為和特征,並進行的封裝,特征稱之為屬性,行為稱之為方法;
對象就是這一類的具體實例,對象擁有這個類的所有屬性和方法
舉個例子:
所有的人是一個類,人所具有的屬性:身高和體重...,人具有的方法:吃飯,睡覺..
具體到某一個人是一個對象,比如小明就是一個對象,小明有身高,體重,可以吃飯,可以睡覺..
java編程思想中是這么描述對象的:
對象具有狀態,行為,和標識.這意味着每一個對象都可以擁有內部數據(它們給出了該對象的狀態)和方法(它們產生行為),並且每一個對象都可以與其他對象區分開來,具體來說,就是每一個對象在內存中都有一個唯一的地址.
2,什么是面向對象?為什么要面向對象?
官方話:
面向對象(Object Oriented)是一種新興的程序設計方法,或者是一種新的程序設計規范(paradigm),其基本思想是使用對象、類、繼承、封裝、多態等基本概念來進行程序設計。從現實世界中客觀存在的事物(即對象)出發來構造軟件系統,並且在系統構造中盡可能運用人類的自然思維方式。面向對象是為了解決系統的可維護性,可擴展性,可重用性....
我的理解:
首先,面向對象是一種設計程序的方式,是一種設計思想.
其次,面向對象節省代碼,思路清晰,便於擴展.你所創建出的對象就是給你提供服務的.
3,面向對象的三大特征:
一、封裝
封裝是實現面向對象程序設計的第一步,封裝就是將屬性和方法放在一個類中。對外提供服務時盡可能的隱藏對象內部細節,只保留有限的接口和方法;
封裝的意義:
封裝的意義在於保護或者防止代碼(數據)被我們無意中破壞。在面向對象程序設計中屬性被看作是一個中心的元素並且和使用它的方法結合的很密切,從而保護 它不被其它的方法意外的修改。
可以通過對類的成員設置一定的訪問權限,實現類中成員的信息隱藏。
- private:類中限定為private的成員,只能被這個類本身訪問。如果一個類的構造方法聲明為private,則其它類不能生成該類的一個實例。
- default:類中不加任何訪問權限限定的成員屬於缺省的(default)訪問狀態,可以被這個類本身和同一個包中的類所訪問。
- protected:類中限定為protected的成員,可以被這個類本身、它的子類(包括同一個包中以及不同包中的子類)和同一個包中的所有其他的類訪問。
- public:類中限定為public的成員,可以被所有的類訪問。
二, 繼承
Java的類可以分為三類:
- 類:使用class定義,沒有抽象方法
- 抽象類:使用abstract class定義,可以有也可以沒有抽象方法
- 接口:使用inerface定義,只能有抽象方法,(也可以沒有),接口里的變量默認使用public static final修飾
在這三個類型之間存在如下關系:
- 類可以extends:類、抽象類(必須實現所有抽象方法),但只能extends一個,可以implements多個接口(必須實現所有接口方法)--->單繼承多實現
- 抽象類可以extends:類,抽象類(可全部、部分、或者完全不實現父類抽象方法),可以implements多個接口(可全部、部分、或者完全不實現接口方法)
- 一個接口可以繼承多個接口
繼承以后子類可以得到什么:
- 子類直接擁有父類非private的屬性和方法
- 子類可以添加自己的屬性和方法,即對父類進行擴展
- 子類可以重寫父類的方法
關於構造方法:
- 構造方法不能被繼承,子類可以通過super()顯式調用父類的構造方法
- 創建子類對象時,編譯器會自動調用父類的無參構造方法
- 如果父類沒有定義無參構造方法,子類必須在構造方法的第一行代碼使用super()顯式調用
- 類默認擁有無參構造方法,如果定義了其他有參構造方法,則無參構造方法失效,所以父類沒有定義無參構造方法,不是指父類沒有寫無參構造方法。
Java中通過super來實現對父類成員的訪問,super用來引用當前對象的父類。super 的使用有三種情況:
- 訪問父類被隱藏的成員變量
- 調用父類中被重寫的方法
- 調用父類的構造函數
繼承的意義:
- 代碼重用是一點,最重要的還是向上轉型,即父類的引用變量可以指向子類對象,這是Java面向對象最重要特性多態的基礎
三, 多態
在了解多態之前,先了解以下幾點:
什么是相同的方法:
- 一個方法可以由:修飾符+返回值+方法名+參數+throw的異常+方法體6部分組成
- 其中只有方法名和參數是唯一性標識,意即只要方法名和參數相同那他們就是相同的方法
- 所謂參數相同,是指參數的個數,類型,順序一致,其中任何一項不同都是不同的方法
什么是重載:
- 重載是指一個類里面(包括父類的方法)存在方法名相同,但是參數不一樣的方法,參數不同可以是不同的參數個數、類型或順序
- 如果僅僅是修飾符、返回值、throw的異常不同,那這是2個相同的方法,編譯都通不過,更不要說重載了
什么是重寫:
- 子類中存在和父類相同的方法即為重寫(有特殊情況,請注意下面重寫的規則),何謂相同方法請牢記前面的描述,方法名和參數相同,包括參數個數、類型、順序
重寫的規則:
- 子類不能覆蓋父類private的方法,private對子類不可見,如果子類定義了一個和父類private方法相同的方法,實為新增方法
- 重寫方法的修飾符權限一定要大於或等於被重寫方法的修飾符權限(public > protected > default )
- 重寫拋出的異常需與父類相同或是父類異常的子類,或者重寫方法干脆不寫throws
- 重寫方法的返回值必須與被重寫方法一致,否則編譯報錯
- 靜態方法不能被重寫
什么是多態?
同一操作作用於不同的對象,可以產生不同的執行結果,這就是多態性。
Java的多態性體現在兩個方面:由方法重載實現的靜態多態性(編譯時多態)和方法重寫實現的動態多態性(運行時多態)。
- 編譯時多態:在編譯階段,具體調用哪個被重載的方法,編譯器會根據參數的不同來調用相應的方法。
- 運行時多態:當父類引用引用指向子類對象時,被引用的對象的類型決定了調用誰的方法,這個被調用的方法必須是在父類中定義過的,也就是說被子類重寫的方法
1 class Animal { 2 public void speak() { 3 System.out.println("我是動物"); 4 } 5 } 6 7 class Dog extends Animal { 8 public void speak() { 9 System.out.println("汪汪..."); 10 } 11 } 12 13 class Cat extends Animal { 14 public void speak() { 15 System.out.println("喵喵..."); 16 } 17 } 18 19 public class Test { 20 public static void main(String args[]) {
21 Animal animal = new Dog(); 22 animal.speak(); // 汪汪... 23 animal = new Cat(); 24 animal.speak();// 喵喵... 25 } 26 }
稍微復雜一點的案例:
1 class Animal { 2 public void speak1() { 3 System.out.println("我是動物.."); 4 speak2(); 5 } 6 private void speak2() { 7 System.out.println("我是一只凶猛的動物"); 8 } 9 } 10 11 class Dog extends Animal { 12 public void speak1(String name) { 13 System.out.println("汪汪..."); 14 } 15 public void speak2() { 16 System.out.println("我是一只泰迪"); 17 } 18 } 19 20 public class Test { 21 public static void main(String args[]) { 22 Animal animal = new Dog(); 23 animal.speak1(); 24 // 我是動物.. 25 // 我是一只凶猛的動物 26 } 27 }