面向對象
1.面向對象思想
(1)思想的概述:
面向對象是相對於面向過程而言的,面向過程強調的是功能,面向對象強調的是將功能封裝進對象,強調具備功能的對象;
(2)面向對象思想的特點:
A:面向對象就是一種常見的思想。符合人們的思考習慣。
B:面向對象的出現,將複雜的問題簡單化。
C:面向對象的出現,讓曾經在過程中的執行者,變成了對象中的指揮者。
對象:
世間萬物皆對象,對象是事物存在的實體。在java中通過new來創建的。
靜態特性
對象特有的屬性,不能動的部分,用四類八種基本數據類型+string類型保存
動態特性
對象具備的行爲,用方法來體現
類
用java語言對現實生活中的事物進行描述,通過類的形式來體現的。
類是封裝對象的屬性和行爲的載體,反過來說具有相同屬性和行爲的一類實體被稱爲類。類是抽象的
對象是類抽象出來的一個實例
定義類其實就是在定義類中的成員。
成員:成員變量<-->對應於類對象的屬性,
成員方法<-->對應於類對象的行爲。
對象
對象是一類事物中抽象出來的一個實例
用 new操作符來創建一個對象
使用“對象.類成員”來獲取對象的屬性和行爲
匿名對象:沒有名字的對象 ,如 new Car() ,其實就是定義對象的簡寫格式。
當對象對方法僅進行一次調用的時候,就可以簡化成匿名對象
匿名對象可以作爲實際參數進行傳遞
面向對象的特徵主要有以下幾個方面:
封裝(英語:Encapsulation)
封裝就是隱藏對象的屬性和實現細節,只向外界提供最簡單的編程接口,對數據的訪問只能通過已定義的接口。封裝是面向對象編程的核心思想,將對象的屬性和行爲綁定起來,而將對象的屬性和行爲封裝起來的載體就是類,類通常對客戶隱藏其實現細節,這就是封裝的思想。
封裝的好處:1.將變化隔離;2.方便使用;3.提高複用性;4.提高安全性
封裝的優點:1. 良好的封裝能夠減少耦合。2. 類內部的結構可以自由修改。
3. 可以對成員變量進行更精確的控制。4. 隱藏信息,實現細節。
繼承
繼承:多個類中存在相同的屬性和行爲時,將這些相同的內容抽取到單獨的一個類中,那麼多個類就無需再定義這些相同的屬性和行爲,只需繼承那個類即可。提供繼承信息的類被稱爲父類(超類、基類);得到繼承信息的類被稱爲子類(派生類)。
繼承就是子類繼承父類的所有特徵和行爲,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲。
但是父類中private屬性在子類中,不能直接訪問,我們可以通過父類的公共方法進行調用
通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的
繼承的特點:子類繼承了父類的所有屬性
多態
一個對象在程序不同運行時刻代表的多種狀態,父類或者接口的引用指向子類對象
多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態性分爲編譯時的多態性和運行時的多態性。如果將對象的方法視爲對象向外界提供的服務,那麼運行時的多態性可以解釋爲:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來說都是透明的(就像電動剃鬚刀是A系統,它的供電系統是B系統,B系統可以使用電池供電或者用交流電,甚至還有可能是太陽能,A系統只會通過B類對象調用供電的方法,但並不知道供電系統的底層實現是什麼,究竟通過何種方式獲得了動力)。方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫(override)實現的是運行時的多態性(也稱爲後綁定)。運行時的多態是面向對象最精髓的東西,要實現多態需要做兩件事:1). 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);2). 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行爲)。
多態時成員的特點:
1,成員變量。
編譯時:參考引用型變量所屬的類中的是否有調用的成員變量,有,編譯通過,沒有,編譯失敗。
運行時:參考引用型變量所屬的類中的是否有調用的成員變量,並運行該所屬類中的成員變量。
簡單說:編譯和運行都參考等號的左邊。哦了。
作爲了解。
2,成員函數(非靜態)。
編譯時:參考引用型變量所屬的類中的是否有調用的函數。有,編譯通過,沒有,編譯失敗。
運行時:參考的是對象所屬的類中是否有調用的函數。
簡單說:編譯看左邊,運行看右邊。
因爲成員函數存在覆蓋特性。
3,靜態函數。
編譯時:參考引用型變量所屬的類中的是否有調用的靜態方法。
運行時:參考引用型變量所屬的類中的是否有調用的靜態方法。
簡單說,編譯和運行都看左邊。
其實對於靜態方法,是不需要對象的。直接用類名調用即可。
抽象:abstract抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩個方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。
抽象方法和抽象類
關鍵字是abstract,
abstract修飾的方法稱爲抽象方法
訪問控制域 abstract 返回值類型 方法名();抽象方法不能有方法體
abstract修飾的類稱爲抽象類
可以擁有抽象方法的類叫做抽象類
成員變量和局部變量的區別:
1,作用域
成員變量定義在類中,整個類中都可以訪問。
局部變量定義在函數,語句,局部代碼塊中,只在所屬的區域有效。
2,存儲位置
成員變量存在於堆內存的對象中。
局部變量存在於棧內存的方法中。
3,生命週期
成員變量隨着對象的創建而存在,隨着對象的消失而消失。
局部變量隨着所屬區域的執行而存在,隨着所屬區域的結束而釋放。
4,初始化
成員變量都有默認初始化值。
局部變量沒有默認初始化值,使用前必須賦值初始化。
成員方法
返回值類型 方法名(參數列表){ 方法體 }
成員方法分爲有參和無參兩種,同時還分爲有返回值和無返回值
成員方法無返回值可以用“void”關鍵字表示返回值類型
成員方法有返回值的,返回值類型要與方法返回的值類型一致
成員方法中可以調用其他成員方法和成員變量,但不能創建
成員方法中可以定義一個變量,叫做局部變量,當局部變量和成員變量同名時,方法首先訪問的是局部變量
在成員方法內定義的變量稱爲局部變量
方法中的形參也是一個局部變量
局部變量在方法被執行時創建,在方法執行結束時被銷燬
局部變量使用時必須進行賦值操作或被初始化
局部變量的有效範圍稱爲變量的作用域
權限修飾符
public
protected
private
關鍵字private:
(1)私有的意思,權限修飾符 (2)用來修飾成員變量和成員函數
(3)用private修飾的成員只在本類中有效 (4)私有是封裝在代碼中的體現
當聲明類時不使用權限修飾符時,則系統默認設爲protected
類的權限設定會約束成員上的權限設定
構造方法
(1)特點:
構造方法的名稱要和對象所在的類的名稱相同,唯一一個首字母大寫的方法
構造方法沒有返回值類型,沒有返回值
(2)作用:
構造函數是用於創建對象,並對其進行初始化賦值,對象一建立就自動調用相對應的構造函數,
構造方法一般都是放在new之後調用
(3)構造方法的注意事項:
A:如果一個自定義類沒有構造方法,系統會默認給出一個公共的、無參數的、空的構造方法。
B:如果一個自定義類提供了構造方法,那麼,系統將不再給出無參構造方法。這個時候,你可以不使用無參構造方法。如果你想使用,那麼,就必須手動給出無參構造方法。
建議:一般情況下,我們的自定義類都要手動給出無參構造方法。
子父類的構造函數:子類創建時必須先調用父類的構造方法
(4)構造方法和成員方法的區別
A:格式區別
構造方法和類名相同,並且沒有返回類型,也沒有返回值。
普通成員方法可以任意起名,必須有返回類型,可以沒有返回值。
B:作用區別
構造方法用於創建對象,並進行初始化值。
普通成員方法是用於完成特定功能的。
C:調用區別
構造方法是在創建對象時被調用的,一個對象建立,只調用一次相應構造函數
普通成員方法是由創建好的對象調用,可以調用多次
構造代碼塊:
(1)作用:給對象進行初始化,對象一建立就執行,而且優先於構造函數執行
(2)構造代碼塊和構造函數的區別:
構造代碼塊是給所有不同對象的共性進行統一初始化
構造函數是給對應的對象進行初始化
this關鍵字
(1)this關鍵字代表本類對象的一個引用,誰調用this所在的方法,this就代表誰
(2)this的使用場景
A:用於區分同名成員變量和局部變量;可以使用“this.成員變量名”這樣的格式來引用成員變量名
B:在定義函數時,該函數內部要用到調用該函數的對象時,因爲此時對象還沒建立,故this代表此對象
B:構造函數間調用this 關鍵字引用其它的構造方法的時候,this(參數)必須作爲第一條語句存在。
Person p = new Person();
在內存中做了哪些事情;
(1)JVM讀取指定路徑下的Person.class文件,並加載進內存中,
如果有直接的父類的情況下,會先加載Person的父類
(2)如果p定義在主方法中,那麼,就會在棧空間開闢一個變量空間p。
(3)在堆內存給對象開闢空間、並分配地址。
(4)在對象開闢好的空間中,對對象中的屬性進行默認初始化。
(5)對對象中的成員進行顯示初始化。
(6)調用構造代碼塊對對象進行初始化。(如果沒有就不執行)
(7)調用構造方法對對象進行初始化。
在構造函數中,第一行會先調用父類中的構造函數進行初始化。(如果沒有就不執行)
父類初始化完畢後,在對子類的屬性進行顯示初始化。
在進行子類構造函數的特定初始化;
對象初始化完畢。
(8)將對象的內存地址賦值給引用變量p,讓p變量指向該對象。
子父類中的構造函數的特點
1.在子類構造對象時,發現,訪問子類構造函數時,父類也運行了,爲什麼呢?
原因是:在子類的構造函數中第一行有一個默認的隱式語句。 super();
子類的實例化過程:子類中所有的構造函數默認都會訪問父類中的空參數的構造函數。
2.爲什麼子類實例化的時候要訪問父類中的構造函數呢?
那是因爲子類繼承了父類,獲取到了父類中內容(屬性),所以在使用父類內容之前,
要先看父類是如何對自己的內容進行初始化的。所以子類在構造對象時,必須訪問父類中的構造函數。
3.爲什麼完成這個必須的動作,就在子類的構造函數中加入了super()語句。
如果父類中沒有定義空參數構造函數,那麼子類的構造函數必須用super明確要調用
父類中哪個構造函數。同時子類構造函數中如果使用this調用了本類構造函數時,
那麼super就沒有了,因爲super和this都只能定義第一行。所以只能有一個。
但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數。
注意:supre語句必須要定義在子類構造函數的第一行。因爲父類的初始化動作要先完成。
static關鍵字:
(1)靜態的意思,用來修飾成員變量和成員函數
(2)靜態的特點:隨着類的加載而加載,優先於對象存在,對所有對象共享,可以被類名直接調用(3)靜態的注意事項
A:靜態方法只能訪問靜態成員爲什麼:因爲靜態的內容是隨着類的加載而加載,它是先進內存的。
B:靜態方法中不能使用this,super關鍵字
C:不能將方法體內部的局部變量聲明爲static
D:主方法是靜態的,靜態方法中不可以直接調用非靜態方法
public static void main(String[] args)
public:公共的意思,是最大權限修飾符。
static:由於jvm調用main方法的時候,沒有創建對象。只能通過類名調用。所以,main必須用static修飾。
void:由於main方法是被jvm調用,不需要返回值。用void修飾。
main:main是主要的意思,所以jvm採用了這個名字。是程序的入口。
String[]:字符串數組args:數組名
靜態的優點和弊端
優點:對對象的共享數據進行單獨空間的存儲,節省內存,沒有必要每個對象都存儲一份可直接被類名調用
弊端:生命週期過長,隨着類的消失而消失訪問出現權限,即靜態雖好但只能訪問靜態
(6)什麼使用使用靜態呢?
A:當所有對象共享某個數據的時候,就把這個成員變量定義爲靜態修飾的。
B:當某個方法沒有訪問該類中的非靜態成員,就可以把這個方法定義爲靜態修飾。
靜態的生命週期比較長,所以一般不推薦使用。
由 static 修飾的變量、常量、方法被稱爲靜態變量、常量、方法,統稱爲靜態成員
靜態成員是屬於類所有的,可以在本類或其他類使用“類名.靜態成員名”調用靜態成員
靜態變量和成員變量的區別
A:調用方式
靜態變量也稱爲類變量,可以直接通過類名調用。也可以通過對象名調用。
這個變量屬於類。
成員變量也稱爲實例變量,只能通過對象名調用。這個變量屬於對象。
B:存儲位置
靜態變量存儲在方法區長中的靜態區。
成員變量存儲在堆內存。
C:生命週期
靜態變量隨着類的加載而存在,隨着類的消失而消失。生命週期長。
成員變量隨着對象的創建而存在,隨着對象的消失而消失。
D:與對象的相關性
靜態變量是所有對象共享的數據。
成員變量是每個對象所特有的數據。
靜態代碼塊
被static修飾的代碼塊稱爲靜態代碼塊
A:它只執行一次,它比main還先執行。
B:執行順序:靜態代碼塊--構造代碼塊--構造方法
重載(Overload)和重寫(Override)
方法的重載和重寫都是實ava多態性的不同表現,重載可以理解成多態的具體表現形式,重寫是父類與子類之間多態性的一種表現,區別在於前者實現的是編譯時的多態性,而後者實現的是運行時的多態性。
重載(Overload)
重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視爲重載;
每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。
重載規則
- 被重載的方法必須改變參數列表(參數個數或類型或順序不一樣);
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被重載。
- 重載對返回類型沒有特殊的要求,無法以返回值類型作爲重載函數的區分標準。
重寫(Override)
重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的方法名、相同的返回類型,參數列表中,參數的個數、順序、類型必須一樣,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。
使用被重寫的方法時,該方法滿足就近調用的原則
本類中有該方法的定義,則直接調用,沒有
方法的重寫規則
- 參數列表必須完全與被重寫方法的相同;
- 返回類型必須完全與被重寫方法的返回類型相同;
- 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明爲public,那麼在子類中重寫該方法就不能聲明爲protected。
- 父類的成員方法只能被它的子類重寫。
- 聲明爲final的方法不能被重寫。
- 聲明爲static的方法不能被重寫,但是能夠被再次聲明。
- 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明爲private和final的方法。
- 子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明爲public和protected的非final方法。
- 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
- 構造方法不能被重寫。
- 如果不能繼承一個方法,則不能重寫這個方法。