1. 程式人生 > >黑馬程式設計師————面向物件(概述,封裝,建構函式,this,static)

黑馬程式設計師————面向物件(概述,封裝,建構函式,this,static)

概述:

    面向物件(Object Oriented,OO)是當前計算機界關心的重點,它是90年代軟體開發方法的主流。面向物件的概念和應用已超越了程式設計和軟體開發,擴充套件到很寬的範圍。如資料庫系統、互動式介面、應用結構、應用平臺、分散式系統、網路管理結構、CAD技術、人工智慧等領域。

理解面向物件:

  面向物件是相對於面向過程而言。比如:用手機發送簡訊,相對於面向過程而言強調的是功能 :開啟手機-->編寫簡訊-->傳送簡訊。Java面向物件的思想就是強調具有功能的物件:手機開啟,手機編寫簡訊,手機發送簡訊。感覺這些過程是你自己親自在做,而用面向物件的思卻是你指揮著手機去做。面向物件和麵向過程都是一種思想,面向物件是基於面向過程的。

  •   面向物件是相對面向過程而言。
  •   面向物件和麵向過程都是一種思想。
  •   面向過程:強調的是功能行為。
  •   面向物件:將功能封裝進物件,強調了具備功能的物件。面向物件時基於面向過程的。
  •   過程其實就是函式,物件是將函式等一些內容進行了封裝。

面向物件的特點:

  1.    是一種符合人們思考習慣的思想。
  2.    可以將複雜的事情簡單化。
  3.    將程式設計師從執行者轉換成了指揮者。

  在Java中開發的過程:其實就是不斷的建立物件,使用物件,指揮物件做事情。

  設計的過程:其實就是在管理和維護物件之間的關係。

封裝(Encapsulation):

概念:是指隱藏物件的屬性和實現細節,僅對外提供訪問方式。

原則:將不需要對外提供的內容都隱藏起來。把屬性都隱藏,提供公共方法對其訪問。

好處:將變化隔離,便於使用。提高重用性,提高安全性。

封裝的表現形式之一  --> private:私有,許可權修飾符,用於修飾類中的成員(成員函式,成員變數)。私有隻在本類中有效。

  • 私有隻是封裝的一種表現形式。之所以對外提供訪問方式,就是因為可以在訪問方式中加入邏輯判斷等語句。對訪問的資料進行操作,提高程式碼的健壯性。
  • 一個成員變數 通常會對應兩個訪問方式一個是設定值,一個是獲取值。

建構函式:

定義格式:
class 類名稱
{
訪問許可權 類名稱(型別1 引數1,型別2 引數2,…)
{
程式語句;
}
}

特點:

  • 1 函式名與類名相同。
  • 2 不用定義返回值型別。
  • 3 不可以寫return語句。

作用:

   給物件初始化。

注意:
  •  預設建構函式的特點。
    • 當一個類中沒有定義建構函式時,那麼系統會給該類加入一個空引數的建構函式。
    • 當在類中自定義了建構函式之後,預設的建構函式就沒有了
  •  多個建構函式式以過載的形式存在的。
    • 建構函式是給不同的物件進行分別初始化。
建構函式 物件一建立就會呼叫與之對應的建構函式一個類中預設會有一個空引數的建構函式,這個預設的建構函式的許可權和所屬類一致。
  • 如果類被public修飾,那麼預設的建構函式也帶public修飾符。
  • 如果類沒有被public修飾,那麼預設的建構函式,也沒有public修飾。
  • 預設構造建構函式的許可權是隨著的類的變化而變化的。
建構函式與一般函式不同之處:
  • 建構函式和一般函式在寫法上有不同。
  • 在執行上也有不同:建構函式是在物件一建立就執行。給物件初始化。而一般方法是物件呼叫才執行,是給物件新增物件具備的功能。
  • 一個物件建立,建構函式只執行一次。而一般方法可以被物件呼叫多次。
什麼時候定義建構函式
  • 當分析事物時,該事物存在具備一些特性或者行為,那麼將這些內容定義在建構函式中。
建構函式可以被私有化,但是被私有化的建構函式式不能建立物件的。

this關鍵字:

this:代表本類的物件,代表它所在函式所屬物件的引用。簡單說:哪個物件在呼叫this所在的函式,this就代表哪個物件。當定義類中功能時,該函式內部要用到呼叫函式的物件時,這時用this表示這個物件。但凡本類功能內部使用到了本類物件,都用this表示。應用:
  • 用於區分同名變數
  • 用於建構函式之間進行互相呼叫。
注:this語句只能定義在建構函式的第一行。初始化動作要先執行,如果初始化中還有初始化的話,就先執行更細節的初始化。

示例:

class Person
{
	//定義私有屬性
	private String name;
	private int age;
	Person (int age)//建構函式
	{
		this.age = age;
	}
	Person(String name)
	{
		//name = name; //區域性變數的名稱和成員變數的名稱相同,此時兩個name都是區域性的name。
		this.name = name;//this 表面上是區分成員變數和區域性變數。
	}
	Person(String name,int age)
	{
		this(name);//this語句,呼叫建構函式Person(String name)
		//this.name = name;
		this.age = age;
	}
	public void speak()
	{
		System.out.println("name =" + this.name + ",,age =" + this.age);
		this.show();
	}
	public void show()
	{
		System.out.println(this.name);
	}
	/*
	需求:給人定義一個用於比較年齡是否相同的功能。
	*/
	public boolean compare(Person p)
	{
		return this.age == p.age;
	}
}

class PersonDemo 
{
	public static void main(String[] args) 
	{
		Person p = new Person("lisi ");
		Person p1 = new Person("zhangsan");
		//在一個類中成員之間完成互相呼叫都是物件來完成的。
		p.speak();
		p1.speak();
		Person p2 = new Person(15);
		Person p3 = new Person(20);
		boolean b = p2.compare(p3);//this和p2指向了同一個地址值,也就是同一個物件
		System.out.println(b);
	}
}

結果如下

static(靜態)

用法:
  1. 是一個修飾符,用於修飾成員(成員變數,成員函式)。
  2. 當成員被靜態修飾後,就多了一個呼叫方式,除了可以被物件呼叫外,
  3. 還可以直接被類名呼叫。類名.靜態成員。
static特點:
  1. 隨著類的載入而載入  。
    • 當類載入到記憶體中時,static所修飾的成員就已經在記憶體中(方法區,共享區,資料區)開闢好了空間。
    • 也就是說靜態會隨著類的消失而消失,生命週期最長。
  2. 優先於物件存在。靜態是先存在的,物件後存在。
  3. 被所有物件所共享。
  4. 可以直接被類名所呼叫。 類名.靜態成員。
例項變數和類變數的區別:
  • 存放位置:
    • 例項變數:隨著物件的建立而存在於堆記憶體中。
    • 類變數:隨著類的載入而存在於方法去中。
  • 生命週期:
    • 例項變數:生命週期隨著物件的消失而消失。
    • 類變數:生命週期最長,隨著類的消失而消失。
靜態的使用注意事項:
  1. 靜態方法只能訪問靜態成員(成員變數,成員函式).。非靜態方法可以訪問靜態,也可以訪問非靜態。
  2. 靜態方法中不可以定義this,super關鍵字。因為靜態優先於物件存在,所以靜態方法中不可以出現this,super關鍵字。
  3. 主函式是靜態的。
靜態有利有弊
  • 利處:對物件共性資料進行單獨空間儲存,節省記憶體空間。沒有必要每個物件中都儲存一份,可以直接用類名呼叫。
  • 弊端:生命週期過長,訪問出現侷限性,靜態成員只能訪問靜態。
什麼時候使用靜態?
  1. 什麼時候定義靜態變數(類變數)
    • 當物件中出現共享資料時,該資料被靜態所修飾。物件中的特有資料要定義成非靜態存在於堆記憶體中。
  2. 什麼時候定義靜態函式
    • 當功能內部沒有訪問到非靜態資料(物件的特有資料),那麼這時該函式(功能)可以定義成靜態。
 靜態程式碼塊
  • 就是一個有靜態關鍵字標示的一個程式碼塊區域。定義在類中。

  •  格式:
 static
 {
靜態程式碼塊中執行語句。
 }
  • 特點:
    • 隨著類的載入而執行,只執行一次,如果和主函式在同一類中,優先於主函式執行。
  • 作用:
    • 用於給類進行初始化的。
  •  例項:
class StaticCode{
	static
	{
		System.out.prontln("a");
	}
}

class StaticCodeDemo
{
	static
	{
		System.out.prontln("b");
	}
	public static void main(String[] args)
	{
		new StaticCode();
		new StaticCode();//因為類已經載入,靜態程式碼塊已經執行過,所以沒有列印結果。
		System.out.prontln("over");
	}
	static
	{
		System.out.prontln("c");
	}
}

//列印結果 b c a over