6、面向對象


六、面向對象

1、系統結構圖(xmind)


2、tips

——1.理解面向對象

       喬布斯是這樣理解面向對象的:

       對象就像人一樣,也是活生生的生命。他們有知識,知道怎麼完成任務;他們有記憶,可以把發生的事情記下來。而你和他們的互動並不是低層次的,你是與他們在一個高度抽象的層面上互動,就像我們現在的對話一樣。

       我舉個例子來說明。如果我是一個“洗衣”對象,你可以把髒衣服給我,然後告訴我說:“請幫我把這些衣服洗了吧!”而我恰好知道舊金山最好的洗衣房在哪,並且我會說英語,兜裏也有美元。於是我出門打了一輛出租車,告訴司機帶我去位於舊金山的洗衣房。我到了那裏洗好衣服之後,又坐車回到這裏。我把洗好的衣服交還給你,說:“你的衣服已經洗好了。”

       你並不知道我是怎麼做到的。你不知道哪裏有洗衣店,也可能只會說法語,或者是兜裏沒錢,連車都打不了。但是我知道怎麼完成這項任務,而你不需要知道任何細節。所有的這些複雜流程都隱藏在我的內部,而我們之間可以高度抽象地互動。這就是對象。他們把複雜過程封裝在內部,而對外呈現的接口是高層次的,抽象的。


——2、成員變量和局部變量

之前我們用到的基本都是局部變量,現在我們將會使用成員變量。其實它兩都是變量,規範寫法上也沒啥區別,都是標識符,但是在作用範圍和內存中分配不同。
區別:

        成員變量:
                a)成員變量定義在類中,在整個類中都可以被訪問。
                b) 成員變量隨着對象的建立而建立,存在於對象所在的堆內存中。
                c) 成員變量有默認初始化值。

       局部變量:
                a) 局部變量只定義在局部範圍內,如:函數內,語句內等。
                b) 局部變量存在於棧內存中。
                c) 作用的範圍結束,變量空間會自動釋放。
                d) 局部變量沒有默認初始化值。

——3.匿名對象

慄:

class Car
{
	String color = "red";
	int num = 4;
	public static void run()
	{
		System.out.println("function run is running!" );
	}
}

class CarDemo
{
	public static void main(String[] args)
	{
		//對對象方法僅進行一次調用時,就可以使用匿名對象
		new Car().run();
		//匿名對象可以作爲實際參數進行傳遞
		show(new Car());
	}
	public static void show(Car c)
	{
		c. num = 3;
		c. color = "black" ;
		System.out.println("function show is running!" );
		System.out.println(c.num + "..." + c. color);
	}
}

運行結果:

      


——4.封裝的表現形式之一——private(私有)

   

private關鍵字:權限修飾符;用於修飾類中的成員(成員變量,成員函數);私有隻在本類中有效。
       常用之一:
                將成員變量私有化,對外提供對應的set,get方法對其進行訪問。提高對數據訪問的安全性。
                如:我有一個人對象,而年齡這一屬性我不想被對象訪問,我就可以將其設爲private。


——5.構造函數

1.細節:當一個類沒有定義構造函數時,那麼系統就會默認給該類加入一個空參數的構造函數。當在類中自定義了構造函數後,默認的構造函數就沒有了。

2、構造函數和一般函數在寫法上有不同。

在運行上也有不同:

        構造函數式在對象一建立就運行,給對象初始化。而一般方法是對象調用才執行,給是對象添加對象具備的功能。一個對象建立,構造函數只運行一次。而一般方法可以被該對象調用多次。

3、什麼時候定義構造函數?

       當分析事物時,該事物存在具備一些特性或者行爲,那麼將這些內容定義在構造函數中。

4、構造代碼塊

       作用:給對象進行初始化。對象一建立就運行,而且優先於構造函數運行。

和構造函數的區別:

       構造代碼塊是給所以對象進行初始化。

       而構造函數是給對應的對象初始化。

構造代碼塊中定義的是不同對象共性的初始化內容。

——6.this關鍵字
慄:
class Person  
{  
    private String name;  
    private int age;  
    Person(int age)//局部變量時age,成員變量也是age  
    {  
        this.age = age;//this能夠很好區分  
    }  
    Person(String name)  
    {  
        this.name = name;//這裏用this表示調用構造方法的對象  
    }  
    Person(String name,int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
  
    public void speak()  
    {  
        System.out.println("name="+name+"...age="+age); 
		show();  
    }  
    public void show()  
    {  
        System.out.println(this.name);  
    }  
}

 以上程序綜合了構造函數和this的用法。看上去,是用於區分局部變量與成員變量同名情況。
       this代表它所在函數所屬對象的引用。

——7.static關鍵字
       1. 由於靜態成員可以直接被類名調用,因此靜態成員變量又稱爲類變量。而非靜態成員變量又被稱爲實例變量

實例變量和類變量的區別:
        存放位置:
              類變量隨着類的加載而存在於方法區中。
              實例變量隨着對象的建立而存在於堆內存中。
       
        生命週期:
              類變量生命週期最長,隨着類的消失而消失。
              實例變量生命週期隨着對象的消失而消失。

2.靜態的利弊

        利處:對對象共享數據進行單獨空間的存儲,節省空間。沒有必要每一個對象中都存儲一份。可以直接被類名調用。
        弊端:生命週期過長。
                   訪問出現侷限性。(只能訪問靜態)


3.什麼時候使用靜態?
        從兩方面下手: 因爲靜態修飾的內容有成員變量和函數。

4.什麼時候定義靜態變量(類變量)呢?
        當對象中出現共享數據時,該數據被靜態所修飾。
        對象中的特有數據要定義成非靜態存在於堆內存中。

5.什麼時候定義靜態函數呢?
        當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義成靜態的。

6.靜態使用注意事項:
        1、靜態方法只能訪問靜態成員。
              非靜態方法既可以訪問靜態也可以訪問非靜態。
        2、靜態方法中不可以定義this,super關鍵字。
              因爲靜態優先於對象存在。所以靜態方法中不可以出現this。
        3、主函數是靜態的。

7.靜態代碼塊:
              static
              {
                           靜態代碼塊中的語句。
              }
特點:隨着類的加載而執行,執行一次。並優先於主函數。用於給類進行初始化。

8.對象的初始化過程:

        1、把類名.class文件加載到內存中。
        2、執行該類中的static代碼塊,如果有得話,給該類進行初始化。
        3、在堆內存中開闢空間,分配內存地址。給對象
        4、在堆內存中建立對象的特有屬性。並進行默認初始化。
        5、對屬性進行顯示初始化。
        6、對對象進行構造代碼塊初始化。
        7、對對象進行對應構造函數初始化
        8、將內存地址賦給棧內存中的對象名變量。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章