什么是面向對象
面向對象 Object Oriented Programming 簡稱:OOP吼蚁;
在程序中使用對象來映射現(xiàn)實中的事物,適用對象的關系來描述事物之間的聯(lián)系问欠,這種思想就是面向對象肝匆;
面向對象與面向過程的區(qū)別
面向過程就是分析解決問題所需要的步驟,然后用函數(shù)把這些步驟一一實現(xiàn)溅潜,使用的時候依次調用就可以了术唬。
面向對象則是把解決的問題按照一定規(guī)則劃分為多個獨立的對象,然后通過對象的方法來解決問題滚澜。一個應用程序會包含多個對象粗仓,通過多個對象的相互配合來實現(xiàn)應用程序的功能。當某個應用程序功能需要改變時,只需要修改個別的對象即可借浊,這樣可以使代碼更容易維護塘淑,效率更高。
例如:洗衣服蚂斤,之前小鯨魚是將衣服放到盆里面存捺,然后倒入適量洗衣粉,在加入適量水曙蒸,然后這時候小鯨魚就開始了純手工搓洗階段捌治,有了面向對象之后,小鯨魚就像是擁有了一臺洗衣機纽窟,就只需要將衣服放進洗衣桶肖油,然后倒入洗衣粉,按下開始按鈕臂港,此時森枪,小鯨魚就只需要等待它洗好就行,所以很大程度上提高了效率
面向對象的三大特性
封裝性
????????封裝性是面向對象的核心思想审孽,將對象的屬性和方法封裝起來县袱,不需要讓外界知道具體實現(xiàn)的細節(jié),這就是封裝的思想佑力。
????????封裝可以是數(shù)據(jù)的安全得到保證式散。當把過程和數(shù)據(jù)封裝起來后,對數(shù)據(jù)的訪問只能通過已定義的接口進行
繼承性
? ? ? ? 繼承主要指的是類與類之前的關系搓萧。通過繼承杂数,可以有效的對原有類的功能進行擴展。
????????繼承不僅增強了代碼的復用性瘸洛,提高了開發(fā)效率 揍移,更為程序的修改補充提供了便利
????????注意:繼承要是用extends關鍵字,并且java中只允許單繼承反肋,即一個類只能有一個父類那伐。這樣的繼承關系呈樹狀,體現(xiàn)了java的簡單性石蔗,子類只能繼承在父類中可以訪問的屬性和方法罕邀,實際上父類中私有的屬性和方法也會被子類繼承,只是子類無法訪問
多態(tài)性
? ? ? ? 多態(tài)是把子類型的對象主觀的看作其父類型的對象养距,那么父類型就可以是很多種類型诉探。
????????多態(tài)有以下特性:
? ? ? ? ????????對象的實例確定后則不可改變(客觀不可改變);
? ? ? ? ? ? ? ? 只能定義編譯時類型所定義的方法棍厌;
? ? ? ? ? ? ? ? 運行時會根據(jù)運行時類型去調用相應類型中定義的方法肾胯;
構造方法主要特點
構造方法的名稱必須與類的名稱完全相同
構造方法不返回任何數(shù)據(jù)竖席,也不需要使用void關鍵字聲明
構造方法的作用是創(chuàng)建對象并初始化成員變量
在創(chuàng)建對象時,系統(tǒng)會自動調用類的構造方法
構造方法一般用public關鍵字聲明
每個類至少有一個構造方法敬肚。如果不定義構造方法毕荐,java將提供一個默認的不帶參數(shù)且方法為空的構造方法
構造方法也可以重載
訪問修飾符的作用范圍
私有的訪問修飾符private
? ? ? ? private修飾符對應最嚴格的訪問級別,被聲明為private的方法艳馒、變量和構造方法只能被所屬類訪問憎亚。
無訪問修飾符
? ? ? ? 不使用訪問修飾符聲明的變量和方法,可以被這個類本身或者與類在同一個包內(nèi)的其他類訪問
受保護的訪問修飾符protected
? ? ? ? protected修飾符不能修飾類和接口弄慰,方法和成員變量能夠聲明為protected第美,但是接口的成員變量個成員方法不能聲明為protected。
共有的訪問修飾符public
? ? ? ? 被聲明為public的類陆爽、方法斋日、構造方法和接口能夠被任何其他類訪問。
非訪問修飾符
1.static修飾符
? ? ? ? static修飾符用來修飾類和成員變量和成員方法墓陈,也可以形成靜態(tài)代碼塊。static修飾的成員變量和成員方法一般稱為靜態(tài)變量和靜態(tài)方法第献,可以直接通過類名訪問它們
2.final修飾符
????????final可以修飾類贡必、方法和變量,意義不同庸毫,但是本質相同仔拟,都是表示不可改變;
? ? ? ? 使用final方法的原因有兩個:
? ? ? ? ? ? ? ? 一是把方法鎖定飒赃,防止任何繼承類修改它的意義和實現(xiàn)利花;
? ? ? ? ? ? ? ? 二是高效(編譯器在遇到調用final方法時,會轉入內(nèi)嵌機制载佳,大大提高執(zhí)行效率)炒事;
3.abstract修飾符
????????abstract用來修飾類,這個類成為抽象類蔫慧。抽象類不能用來實例化對象挠乳,聲明抽象類的唯一目的是為了將來對該類進行擴充。
????????抽象類可以包含抽象方法和非抽象方法姑躲。
????????抽象方法不能被聲明陳final和static睡扬。
4.synchronized修飾符
? ? ? ? synchronized聲明的方法同一時間只能被一個線程訪問。
? ? ? ? synchronized的作用范圍有如下兩種:
? ? ? ? ? ? 1)在某個對象內(nèi)黍析,synchronized修飾的方法可以防止多個線程同時訪問卖怜。
? ? ? ? ? ? ?2)在某個類中,用synchronized修飾靜態(tài)方法可以防止多個線程同時訪問這個靜態(tài)方法阐枣。
5.transient修飾符
? ? ? ? 序列化對象包含被transient修飾的成員變量時马靠,JVM跳過該特定的變量奄抽。該修飾符包含在定義變量的語句中,用來預處理類和變量的數(shù)據(jù)類型虑粥。
6.volatile修飾符
? ? ? ? java語言是支持多線程的如孝,為了解決線程并發(fā)的問題,在語言內(nèi)部引入了同步塊和volatile關鍵字機制娩贷。volatile修飾的成員變量在每次被線程訪問時都強制從共享內(nèi)存中重新讀取該成員變量的值第晰。而且,當成員變量發(fā)生變化時彬祖,會強制線程將變化值會寫到共享內(nèi)存茁瘦。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值储笑。(一個volatile對象引用可能是null)
接口與抽象類的不同點
1.接口支持多繼承甜熔,抽象類不能實現(xiàn)多繼承
2.一個類只能繼承一個抽象類,但是可以實現(xiàn)多個接口
3.接口中的成員變量只能是public static final類型的突倍,抽象類中的成員變量可以是各種類型的
4.接口只能定義抽象方法腔稀;抽象類既可以定義抽象方法,也可以定義實現(xiàn)的方法
5.接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(static修飾的方法)羽历,抽象類可以有靜態(tài)代碼塊和靜態(tài)方法
接口與抽象類的相同點
1.都可以被繼承
2.都不能被直接實例化
3.都可以包含抽象方法
4.派生類必須實現(xiàn)未實現(xiàn)的方法