目錄
2、面向過程 (OPP) 和麪相對象 (OOP) 的關係和區別
一、面向對象
1、概念:
面向對象是一種思維方式、編程方式,並不只針對某一種編程語言,基本思想是從現實世界中客觀存在的事物出發來構造軟件系統,並在系統的構造中儘可能運用人類的自然思維方式。
2、面向過程 (OPP) 和麪相對象 (OOP) 的關係和區別
面向過程:
側重整個問題的解決步驟,着眼局部或者具體。
優點:
1.流程化使得編程任務明確,在開發之前基本考慮了實現方式和最終結果;
2.強調代碼的精簡實用,善於結合數據結構來開發高效率的程序;
3.流程明確,具體步驟清楚,便於節點分析。
缺點:
1.代碼重用性低,擴展能力差,維護起來難度高;
2.對複雜業務來說,需要深入的思考,耗費精力,模塊化難度高,耦合度高。
面向對象:
側重具體的功能,讓某個對象具有這些功能,側重於整體。
優點:
1.結構清晰,便於模塊化,抽象化,符合人類的思維方式;
2.封裝性,將事務高度抽象,從而便於流程中的行爲分析,也便於操作和自省;
3.容易擴展,代碼重用率高,可繼承,可覆蓋;
4.實現簡單,可有效地減少程序的維護工作。
缺點:
1.面向對象和代碼底層的直接交互少,不適合底層、遊戲、多媒體開發;
2.事務本身是面向過程的,過度的封裝導致事務本身的複雜性提高。
知乎經典比喻:
面向過程:搖狗尾巴 = 搖(狗尾巴)
面相對象:狗搖尾巴 = 狗.搖尾巴() >>> 狗是對象,搖尾巴是狗的屬性和方法
人.搖(狗尾巴) >>>多態警告
3、面向對象的三大特徵
封裝:
屬性—描述一類事物的特徵;
方法—描述一類事物的操作;
概念:封裝就是把屬於同一類事物的共性屬性與方法歸到一個類中,以方便使用。
優點:
(1)專業分工;
(2)隱藏信息;
繼承:
概念:一個類繼承另一個類,則稱繼承的類爲子類,被繼承的類爲父類。
優點:代碼複用;
注意:子類可以寫自己特有的屬性和方法實現功能擴展,也可以重寫父類的方法,但父類私有屬性和構造方法不能被繼承。
多態:
概念:多態就是在抽象的層面上定義一個統一行爲,到具體層面上時這個統一的行爲會因具體的形態特徵實施自己的特徵行爲,實際開發中是指程序中定義的引用變量所指向的具體類型和通過該引用變量引發的方法調用在編程時並不確定,而是在程序運行期間才確定。
舉例:造汽車(對象)
抽象—首先,你要知道車要有哪些最基本的部件,如發動機、輪轂等,這一過稱作抽象;
封裝—因爲工作量很龐大,需要找人一起造,但是不想讓他知道造車的技術,可以把造車的技術隱藏起來,告訴別人只需要知道他自己要做什麼就好了,這一過程稱作封裝;
繼承—需要造很多車,想用之前造出來的某個車作爲模板,進行“克隆”,用模板創出來的車具有模板的特徵,就像孩子一樣具有父母的性狀,這一過程稱作繼承;
多態—很多車都是用模板“克隆”出來的,爲了讓品類更豐富多彩一些,對它們又進行了改變,這一過程稱作多態。
4、面向對象的五大原則:
單一職責:
就一個類而言,應該僅有一個引起它變化的原因。
例如:不要將數據庫的操作、文件的操作、算法的運用等都寫在一個類中,應該按照功能不同各自分開,可實現代碼複用。
開發封閉:
是軟件實體(類、模塊、函數等),可以擴展的,但是不可修改。
依賴倒置:抽象不應該依賴細節,細節應該依賴於抽象。
例如:客戶端向數據庫插入數據,最初保存到MySql,現在改爲保存到Oracle,應該對插入業務進行抽象,使客戶端依賴插入業務,而不是依賴MySql或Oracle數據庫操作。
里氏替換:子類必須能夠替換掉他們的父類,意思是子類必須具有父類的所有特性。
接口隔離:多個專用的接口優於一個單一的通用接口,不要把所有的方法都添加到一個接口中。
二、類和對象
1.類是對現實生活中事物的描述,對象是這類事物的一個個體。
2.類和對象在Java中的體現:
{1}. 在Java中描述事物就是用class來定義類;
{2}. 在Java中產生一個類的實體就是用new來創建類的對象。
3.描述事物和Java中類的關係:
{1}. 描述事物就是在描述事物的屬性和行爲;
{2}. 定義類就是在描述事物,就是在定義事物的屬性和行爲。
4.類的成員:類中的屬性和行爲共同組成了類中的成員。
三、構造函數
1.構造函數的作用
給對象進行初始化(也就是爲對象的某些屬性進行賦值,使得對象一產生就具備某些特徵)
2.構造函數的特點
[1]. 函數名和類名相同;
[2]. 沒有返回值類型(沒有return語句);
[3]. 構造函數只能用 new 初始化對象,不能像普通方法那樣被調用。
3.構造函數被調用的時機
對象一建立,就會調用與之對應的構造函數。
4.構造函數的小細節
一個類中沒有顯式定義構造函數時,OS會自動給該類加入一個空參構造函數; 如果一個類顯式定義了一個構造函數,OS便不再自動加入一個空參數的構造函數。
5.構造函數和普通函數的區別
[1]. 寫法不同;
[2]. 運行不同:
{1} 構造函數在對象一建立的時候,就來給對象進行初始化;
{2} 只有對象調用才執行。
[3]. 執行次數不同:
{1} 構造函數用來給對象進行初始化,僅運行一次;
{2} 普通的方法可以被對象多次調用,可以執行多次;
四、構造代碼塊
1.構造代碼塊的寫法與目的
[1]. 寫法:用一對{}封裝起來一段代碼,並把這個代碼塊放在類的成員的位置上。
[2]. 目的:構造代碼塊,顧名思義是起到構造方法的作用的代碼塊,即是給對象進行初始化的代碼塊。
2.構造代碼塊和構造函數的區別
[1]. 初始化對象不同:
{1}. 構造代碼塊:對這個類所有的對象進行共性的初始化;
{2}. 構造函數:可以指定,可以對指定對象進行個性的初始化。
[2]. 執行順序不同:構造代碼塊先於構造函數執行。
例:(面試題)
請問如下代碼輸出結果是什麼?
class Person{
private String name;
private int age;
//構造代碼塊
{
name ="Benjamin";
age = 18;
System.out.println("Person code run....");
}
Person(){
System.out.println("name ="+ name+", age ="+age);
}
Person(String name, int age){
this.name =name;
this.age =age;
System.out.println("name ="+ name+", age ="+age);
}
}
public class Test {
public static void main(String[] args) {
Person p1 =new Person();//調用空參數構造函數進行初始化
Person p2 =new Person("zxm", 28);//調用非參數構造函數進行初始化
/*
* 兩個Person對象,分別指定用不同的構造函數進行初始化。個性的初始化
* 但是,在每一個構造函數運行之前,構造代碼塊都對這兩個對象進行統一
*/
}
}
答案:
五、靜態代碼塊
1、靜態代碼塊的格式
在構造代碼塊的原有格式之前加上static關鍵字就把構造代碼塊變成了靜態代碼塊。
static{
//靜態代碼塊中的執行語句
}
2、靜態代碼塊的特點
(1)隨着類加載而執行;
(2)僅僅執行一次,用來爲類進行初始化;
(3)優先於本類的main執行(靜態代碼塊沒有名字,如果不馬上執行就無法再找到,main方法具有名字,可以被JVM調用)。
3、靜態代碼塊的書寫目的
類被加載進內存的時候,在沒有對象的情況下,很有可能需要執行一些動作,如果這些動作寫在一個靜態方法中,那麼只有這個靜態方法被調用,相對應的動作纔會被執行,無法實現隨着類加載就執行的功能,這些隨着類加載就執行的動作就可以寫在靜態代碼塊中。
4、靜態代碼塊和構造代碼塊的關係和區別
靜態代碼塊:給類初始化,僅執行一次,優先於main執行;
構造代碼塊:給對象進行公有初始化,僅執行一次,優先於指定的構造方法執行。
JAVA基礎篇專欄持續更新中,更多JAVA基礎知識請移步專欄垂閱,希望對您有幫助!