面向對象(上)

1、概

    面向過程注重的是功能和行爲,而面向對象注重的是具有功能和行爲的對象。面向對象是一種基於面向過程的編程思想。
    學過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

相關文章
相關標籤/搜索