天天看點

黑馬程式員——java基礎——面向對象

點選打開連結 點選打開連結 點選打開連結 android教育訓練、<a">點選打開連結 點選打開連結 java教育訓練、期待與您交流!">點選打開連結 點選打開連結

面向對象

面向對象概念

    面向對象是一種思想,是相對于面向過程而言的。面向過程是早期的一種軟體開發方法,面向過程程式設計就是把一個複雜的待求解的問題分解成若幹個較小的問題,每一個問題的求解是一個過程,每個過程都可以單獨進行設計、修改和調試,程式的流程按照事先設計好的程式進行,不能改變。而面向對象程式設計方法将資料和所有與這些資料相關的操作一起打包在軟體包中,這個類有自己的屬性和行為,當我們要使用這個類中的屬性或者方法時,隻要建立這個類的執行個體,就可以用了。

了解面向對象

l 面向對象是相對面向過程而言

l 面向對象和面向過程都是一種思想

l 面向過程:強調的是功能行為

l 面向對象:将功能封裝進對象,強調具備了功能的對象

l 面向對象是基于面向過程的。

l 面向對象的三個特征:封裝、繼承、多态。

類與對象的關系

類與對象

l 類就是對現實生活中事物的描述

l 對象就是這類事物實實在在存在的個體。

成員變量與局部變量的差別

l 成員變量作用于整個類中,在堆記憶體中存在。

l 局部變量作用于函數或者語句中,存在棧記憶體中。

匿名對象是對象的簡化形式,當對對象的方法隻調用一次時,可以用匿名對象來完成,這樣寫比較簡化。

匿名對象兩種使用情況

l 當對對象方法僅進行一次調用時

l 匿名對象可以作為實際參數進行傳遞

如果對一個對象進行多個成員調用,必須給這個對象起個名字。

封裝(Encapsulation)  

封裝:是指隐藏對象的屬性和實作細節,對外提供公共通路方式。

封裝的好處:

l 将變化隔離

l 便于使用

l 提高重用性

l 提高安全性

封裝原則:

l 将不需要對外提供的内容都隐藏起來

l 把屬性隐藏,提供公共方法對其通路

 Private

    關鍵字:私有,權限修飾符:用于修飾類中的成員(成員變量、成員函數),被私有化的成員隻在本類中有效。

    常用之一:将成員私有化,對外提供對應的set\get方法對其進行通路。提高資料通路的安全性。

    私有隻在本類中通路。成員變量私有化以後,類以外即使建立了對象也不能直接通路,是以需要在類中提供通路的方法。之是以對外提供通路方式,是因為可以在通路方式中加入邏輯判斷等語句。對通路進行操作,提高代碼的健壯性。

構造函數

什麼時候定義構造函數?

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

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

3.4.2 構造函數和構造代碼塊的差別:

l 構造代碼塊是給所有對象進行統一初始化

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

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

this關鍵字

 this:當定義類中功能時,該函數内部要用到調用函數的對象時,這時用this來表示這個對象

l 用于區分局部變量和成員變量同名的情況

l 代表本類的對象,代表它所在函數的所屬對象的引用

l 哪個對象在調用this所在函數,this就代表哪個對象

l 用于構造函數之間的互相調用,不能用于一般函數。

l 隻能定義在第一行。因為初始化動作要先執行。

應用:但凡本類功能内部使用了本類對象,都用this表示。

static關鍵字

用于修飾成員(成員變量和成員函數)

被修飾後的成員具備以下特點:

l 随着類的加載而加載,随着類的消失而消失,說明它的生命周期長

l 優先于對象存在  靜态是先存在,對象是後存在的

l 被所有對象所共享

l 可以直接被類名調用 類.靜态成員

執行個體變量和類變量的差別:

①存放位置

    類變量随着類的加載而存在于方法區中。

    執行個體變量随着對象的建立而存在于堆記憶體中

②生命周期:

    類變量生命周期最長,随着類的消失而消失。

執行個體變量生命周期随着對象的消失而消失。

使用注意事項:

l 靜态方法隻能通路靜态成員。非靜态方法既可以通路靜态也可以通路非靜态。

l 靜态方法中不可以寫this、super關鍵字,因為靜态優先于對象存在。

靜态有利有弊

l 利:對對象的共享資料進行單獨空間的存儲,節省空間,沒有必要每一個對象中都存儲一份。  可以直接被類名調用

l 弊端:生命周期過長  通路出現局限性

什麼時候使用靜态

要從兩方面下手,靜态修飾的内容有成員變量和成員函數。

l 什麼時候定義靜态變量(類變量)?

    當對象中出現共享資料時,該資料被靜态所修飾。對象中的特有資料要定義成非靜态資料存在于堆記憶體中。

l 什麼時候定義靜态函數?

當功能内部沒有通路到非靜态資料(對象的特有資料),那麼該功能可以定義成靜态的。

靜态的應用

l 每一個應用程式中都有共性的功能,可以将這些功能進行抽取,獨立封裝,以便複用。這個類中沒有封裝特有資料,考慮到讓程式更加嚴謹,可以讓類中的方法都定義成static的,直接通過類名調用即可。

l 将方法都靜态後,可以友善于使用,但是該類還是可以被其他程式建立對象的,為了更嚴謹,強制讓該類不能建立對象。可以通過構造函數私有化完成。

靜态代碼塊

格式:

static

{

   靜态代碼塊中的執行語句

}

特點:随着類的加載而執行,隻執行一次。并優先于主函數

習題:假設有一個Person的類,請問JVM運作到這句程式時都做了什麼事情?

Person  p=new Person(“zhangsan”,20);

1) 因為new用到了Person.class,是以會先找到Person.class檔案并加載到記憶體中

2) 執行該類中的static代碼塊,如果有的話,給Person.class類進行初始化

3) 在堆記憶體中開辟空間,配置設定記憶體位址

4) 在堆記憶體中建立對象的特有屬性,并進行預設初始化。

5) 對屬性進行顯示初始化

6) 對對象進行構造代碼塊初始化。

7) 對對象進行對應的構造函數初始化

8) 将記憶體位址賦給棧記憶體中的p變量

主函數

  是一個特殊定義的函數,作為程式的入口,可以被JVM調用。

主函數的定義:

l public:代表着該函數的通路權限是最大的

l static:代表着主函數随着類的加載就已經存在了

l void:沒有具體傳回值。

l main:不是關鍵字,但是是一個特殊的單詞,可以被JVM識别。

l (String[] args):函數的參數,參數類型是一個數組,該數組中的元素是字元串。字元串類型的數組。

主函數的格式是固定的:被JVM識别.唯一能改變的是args,變量名

文檔的制作

 Java的說明書是通過文檔注釋來完成,例子見練習題

**
這是一個可以對數組進行操作的工具類,該類中提供了擷取最值、排序等功能。
@author 李斌
@version v1.0
*/
public class Tools
{
	/**
	空參數構造函數。
	*/
	private Tools(){}
	/**
	擷取一個整形數組中的最大值
	@param arr 接收一個int類型的數組
	@return 會傳回一個數組中的最大值
	*/
	public static int getMax(int[] arr)
	{
		int max=0;
		for(int i=1;i<arr.length;i++)
		{
			if(arr[max]<arr[i])
				max=i;
		}
		return arr[max];
	}
	/**
	擷取一個整形數組中的最小值
	@param arr 接收一個int類型的數組
	@return 會傳回一個數組中的最小值
	*/
	public static int getMin(int[] arr)
	{
		int min=0;
		for(int i=1;i<arr.length;i++)
		{
			if(arr[min]>arr[i])
				min=i;
		}
		return arr[min];
	}
	/**
	給整形數組進行冒泡排序
	@param arr 接收一個int類型的數組
	*/
	public static void bubbleSort(int[] arr)
	{
		for(int j=0;j<arr.length-1;j++)
		{
		     for(int i=0;i<arr.length-j-1;i++)
		     {
			      if(arr[i]>arr[i+1])
				 {
					  swap(arr,i,(i+1));
				 }
		      }
		}
	}
	/**
	給整形數組進行選擇排序
	@param arr 接收一個int類型的數組
	*/
	public static  void selectSort(int[] arr)
	{
		for(int j=0;j<arr.length-1;j++)
		{
		     for(int i=j+1;i<arr.length;i++)
		     {
			      if(arr[j]>arr[i])
				 {
				      swap(arr,j,i);
				 }
			 }
		}
	}
    /**
	給數組中的元素進行位置置換。
	@param arr 接收一個int類型的數組
	@param a 要置換的位置
    @param b 要置換的位置
	*/
	private static void swap(int[] arr,int a,int b)
	{
		int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;
	}	
	/**
	用于列印數組中的元素,列印形式是:[element1,element2,......]
	*/
   public static void printArray(int[] arr)
	{
      for(int i=0;i<arr.length;i++)
		{
			if(i!=arr.length-1)
				System.out.print(arr[i]+";");
			else
				System.out.println(arr[i]+".");
		}
   }
}
           

 一個類中預設會有一個空參數的構造函數,這個預設的構造函數的權限和所屬類一緻。

l 如果類被public修飾,那麼預設的構造函數也帶public修飾符。

l 如果類沒有被public修飾,那麼預設的構造函數也沒有被public修飾。

單例設計模式

設計模式:解決某一類問題最行之有效的方法。

     Java中有23中設計模式

     單例設計模式:解決一個類在記憶體中隻存在一個對象。

想要保證對象唯一

1) 為了避免其他程式過多建立該類對象,先禁止其他程式建立該類對象

2) 還為了讓其他程式可以通路到該類對象,隻好在本類中自定義一個對象。

3) 為了友善其他程式對自定義對象的通路,可以對外提供一些通路方式。

用代碼規則:

l 将構造函數私有化。

l 在類中建立一個本類對象

l 提供一個方法可以擷取到該類對象。

懶漢式和餓漢式

   對象是方法被調用時,才初始化,也叫做對象的延時加載,稱為:懶漢式

   先初始化對象的稱為餓漢式。

餓漢式

class cat

{

private cat(){}

static cat c=new cat();

public static cat getCat()

{

return c;

}

}

懶漢式

class dog

{

private dog(){}

static dog g=null;

public static dog getDog()

{

if(g==null)

g=new dog();

return g;

}

}

定義單例,建議使用餓漢式。