面向過程注重的是功能和行爲,而面向對象注重的是具有功能和行爲的對象。面向對象是一種基於面向過程的編程思想。
學過C語言的都知道她是面向過程的,然後來的C++、C#、Java等都在這個基礎上,都部分或所有地轉移到了面向對象的大陣營中。簡單來講就是一樣作一件事,面向過程要本身作全部的事,事無鉅細面面俱到;而面向對象是先找有沒有能作這件事的對象實體,把要作的事委託給對象來作,本身只要調用對象作事,不用管對象是怎麼作的。例如:你爲遠方的好友寫信,完了要寄給TA這件事。
面向過程:(假設沒有郵差)你寫完信就得本身拿着信,走上幾百裏地甚至更遠的路去 給TA。
面向過程:有郵差了,寫好信直接給郵差付錢就OK了,讓郵差給你寄去,無論郵差是 怎麼到達怎麼給TA的,你只要確認信發到了就好。
從上述例子可知,面向對象相對於面向過程處理一件事更簡單,咱的身份也從執行者變成了指揮者,爽!!!
面向對象有3大特徵:封裝(encapsulation) 繼承(inheritance) 多態(polymorphism)
2、類與對象
說到特性就要引出一個詞「類」,字面意思是具備相同特徵的事物的集體。而對於計算機編程語言來講,類是對對象的屬性和行爲的描述,世間萬物都是實體對象,而有些對象有共同的一些屬性和行爲,爲了便於描述和使用,就將這些共同的屬性和行爲放在類中。這就是說:「類是對象的抽象,對象是類的實例。」
3、封裝
一、概述:
定義:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
優勢: 一、將變化隔離 二、便於使用 三、提升重用性 四、提升安全性
原則:將不須要對外提供的內容隱藏起來;把自有屬性都隱藏,提供公共方法對其訪問。
深刻了解3大特徵以前要定義一個類,這裏用Person表示人這一類事物,人有姓名和年齡這2個屬性,人也能夠說話。Person類代碼以下: java
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } public void sayHello(){ System.out.println("Hello,itheima."); } }
看懂上述代碼還需知道Java中的權限修飾符:private、protected、default、public。如下用表格顯示出被不一樣權限修飾符對應的不一樣訪問權限: 編程
從上面Person類中能夠看出,咱們每一個人的姓名和年齡都是本身的隱私信息,不想讓外界直接訪問和操做,那就用private修飾變成私有的,僅僅提供getAge()和setAge()供外界訪問和操做,這就是Person類對於人這一類事物信息的封裝。類通常由成員變量(屬性)、成員函數(行爲)和構造函數構成。
二、成員變量和局部變量
1)區別 :
做用範圍:成員變量做用於整個類中;局部變量做用於函數(方法)中或者整個語句中。
內存位置:成員變量存在於堆內存中;隨着對象存在而存在,隨着對象消失而消失。局部變 量存在於棧內存中。當方法被調用或語句被執行的時候存在;當方法調用完,或者 語句結束後,就自動釋放內存。
初始值:成員變量有默認初始值;局部變量沒有默認初始值,使用前必須賦值。
定義位置:成員變量定義在類中,方法外;局部變量定義在方法內或者做爲方法的形式參數 存在。
Note:使用變量時,遵循就近原則。首先在局部範圍找,有就使用;接着在成員方法裏找, 有就使用;不然就報錯。
2)成員變量賦值的三種方式:
a)直接在定義的時候賦值,或者是經過對象名.成員賦值。
b)經過 set 方法類賦值
c)在構造函數中賦值(在實例化對象的時候賦值)
三、構造函數
1) 特色:
a)函數名與類名相同
b) 沒有返回類型(無需定義返回值類型)
c)沒有返回值(不寫 return 語句)
2)做用:給對象進行初始化。
Note:
構造函數是用於建立對象,並對其進行初始化賦值,對象一創建就自動調用相對應的構造函數。對於一個對象,構造函數只執行一次。通常函數是不能直接調用構造函數。
一般狀況下類中有一個默認的空參構造函數,且該構造函數的權限和所屬類一致。對於默認構造函數,當一個類中沒有定義任何構造函數時,那麼系統會默認給該類定義一個空參的構造函數;當在類中自定義了構造函數後,默認的空參構造函數就不存在了(通常狀況下建議在自定義類中手動給出無參構造函數)。同一個類中的多個構造函數是以重載的形式存在的。相對於構造函數,成員函數就普通多了,只要按照正常格式和規則定義出來的就是成員函數。
3)構造函數與成員函數的區別:
a)構造函數與通常函數格式(寫法)不一樣:構造函數和類名相同,而且沒有返回類型,也沒有返回值;而普通成員函數能夠任意起名,必須有返回類型,能夠沒有返回值。
b)構造函數與通常函數做用(運行上)不一樣:構造函數用於建立對象,並進行初始化值;而普通成員函數是用於完成特定功能的。
c)構造函數與通常函數調用方式不一樣:構造函數是在建立對象時被系統調用的,對於同一個對象只調用一次相應構造函數;而普通成員函數通常是由建立好的對象調用,而且能夠調用屢次。類中除上述內容以外還會有代碼塊。
4)代碼塊:
格式:由{}括起來的代碼。
分類:局部代碼塊(定義在方法中的代碼塊) 、構造代碼塊(定義在方法外的代碼塊)
做用:
a)局部代碼塊:控制代碼塊內變量的生命週期和做用域(使用範圍), 從而提升效率。
b)構造代碼塊:把全部構造方法中共同的內容定義在構造代碼塊。
c)構造代碼塊與構造函數都是給對象進行初始化的,可是構造代碼塊中定義的是同一類下不一樣對象的共性初始化內容,而且對象一創建就運行,對對象進行統一初始化,優先於構造函數執行。而構造函數是給對象進行特定初始化的。
四、this關鍵字
1)概述:this表明所在函數所屬對象的引用。(簡單說,誰調用 this 所在的方法,this 就表明誰。)
2)this 應用:
a)用於區分同名成員變量和局部變量。
b)當定義類中功能時,該函數內部要用到調用該函數的對象時,用 this 來表示這個對象。但凡本類功能內部使用了了本類對象,都用 this 表示。
c)在構造函數間互相調用對象時,只能用 this(參數);而且 this(參數)只能定義在構造函數的第一個語句(由於初始化動做要先執行)。
五、static關鍵字
1)概述:static關鍵字用於修飾成員(成員變量和成員方法),寫在權限修飾符以後,類型名以前。
2)static特色:(被修飾後的成員具有的特色)
a)隨着類的加載而加載。
b)優先於對象存在。
c)被全部對象所共享。
d)能夠直接被類名調用(類名.成員)
Note:
a)靜態方法只能訪問靜態成員(靜態方法不能調用、獲取非靜態變量;非靜態方法既能夠訪問靜態,也能夠訪問非靜態。)
b)靜態方法中不能夠出現 this、super 關鍵字(由於靜態優先於對象存在)。
c)主函數是靜態的
被static修飾的還有靜態代碼塊,例如: 設計模式
static{ System.out.println(「靜態代碼塊輸出」); }
其特色是:隨着類的加載而執行,只執行一次,用於給類進行初始化的。
2)實例變量(成員變量)與類變量(靜態變量)的區別:
a)調用方式:靜態變量也稱爲類變量,能夠直接經過類名調用,也能夠經過對象名調用,這個變量屬於類。用 static 修飾 成員變量也稱爲實例變量,只能經過對象名調用。這個變量屬於對象。
b)存儲位置:靜態變量存儲在方法區中的靜態區。成員變量存儲在堆內存。
c)生命週期:靜態變量隨着類的加載而存在,隨着類的消失而消失,生命週期長。成員變量隨着對象的建立而存在,隨着對象的消失而消失。
d)與對象的相關性:靜態變量是全部對象共享的數據。成員變量是每一個對象所特有的數據。
Note:靜態變量的優點:對對象的共享數據進行單獨空間的存儲,節省空間。沒有必要每個對象中都存儲一份。能夠直接被類名調用。缺陷:生命週期過長,訪問出現侷限性。(靜態雖好,只能訪問靜態。)
六、單例設計模式
1)概述:解決某一問題最行之有效的方法,java中共有23種設計模式。此處咱們講解其中之一:單例設計模式。
2)單例設計模式的做用:使一個類在內存中只存在一個對象。用代碼實現單例設計模式須要作三部:
a)將構造函數初始化。
eg:private SingleModel(){} 安全
b)在類中建立一個本類對象。
eg:private staticSingleModel s= newSingleModel();
c)提供一個訪問方法能夠獲取到該對象。
eg:public staticSingleModel getInstance()
{
return s;
}
3)寫法:單例設計模式只是爲了保證內存中的對象惟一,其餘在類中該怎麼描述嗎,仍是怎麼描述。單例設計模式有兩種寫法:
a)餓漢式:也就是剛三部中的示例語句。它的特色是先初始化對象。如:Single類一進內存,就已經建立好了對象(在實際開發中,出於安全考慮,建議使用餓漢式)。
代碼以下: 編程語言
class SingleModel { private static SingleModels=new SingleModel(); private SingleModel(){} public static SingleModel getInstance() { return s; } }
b)懶漢式:它的特色對象是方法被調用時,才初始化,這也叫對象的延時加載。如:在如下完整代碼中,Single類進內存,對象尚未存在,只有調用了getInstance()方法時,才建立對象。 函數
代碼以下: this
class SingleModel { private static SingleModels=null; private SingleModel(){} public static SingleModel getInstance() { if(s==null) s=new SingleModel(); return s; } }下面演示單例設計模式的使用,代碼以下:
class Person { private static Person person = new Person(); private Person() { } public static Person getPerson() { return person; } } public class SingleModel { public static void main(String[] args) { Person p1 = Person.getPerson(); Person p2 = Person.getPerson(); System.out.println("p1==p2::" + (p1 == p2)); System.out.println("p1.equals(p2)::" + p1.equals(p2)); } }結果以下:
本篇幅所描述的僅表明我的見解,若有出入請見諒。 spa