黑馬程式設計師————面向物件(概述,封裝,建構函式,this,static)
阿新 • • 發佈:2019-02-07
概述:
面向物件(Object Oriented,OO)是當前計算機界關心的重點,它是90年代軟體開發方法的主流。面向物件的概念和應用已超越了程式設計和軟體開發,擴充套件到很寬的範圍。如資料庫系統、互動式介面、應用結構、應用平臺、分散式系統、網路管理結構、CAD技術、人工智慧等領域。
理解面向物件:
面向物件是相對於面向過程而言。比如:用手機發送簡訊,相對於面向過程而言強調的是功能 :開啟手機-->編寫簡訊-->傳送簡訊。而Java面向物件的思想就是強調具有功能的物件:手機開啟,手機編寫簡訊,手機發送簡訊。感覺這些過程是你自己親自在做,而用面向物件的思卻是你指揮著手機去做。面向物件和麵向過程都是一種思想,面向物件是基於面向過程的。
- 面向物件是相對面向過程而言。
- 面向物件和麵向過程都是一種思想。
- 面向過程:強調的是功能行為。
- 面向物件:將功能封裝進物件,強調了具備功能的物件。面向物件時基於面向過程的。
- 過程其實就是函式,物件是將函式等一些內容進行了封裝。
面向物件的特點:
- 是一種符合人們思考習慣的思想。
- 可以將複雜的事情簡單化。
- 將程式設計師從執行者轉換成了指揮者。
在Java中開發的過程:其實就是不斷的建立物件,使用物件,指揮物件做事情。
設計的過程:其實就是在管理和維護物件之間的關係。
封裝(Encapsulation):
概念:是指隱藏物件的屬性和實現細節,僅對外提供訪問方式。
原則:將不需要對外提供的內容都隱藏起來。把屬性都隱藏,提供公共方法對其訪問。
好處:將變化隔離,便於使用。提高重用性,提高安全性。
封裝的表現形式之一 --> private:私有,許可權修飾符,用於修飾類中的成員(成員函式,成員變數)。私有隻在本類中有效。
- 私有隻是封裝的一種表現形式。之所以對外提供訪問方式,就是因為可以在訪問方式中加入邏輯判斷等語句。對訪問的資料進行操作,提高程式碼的健壯性。
- 一個成員變數 通常會對應兩個訪問方式一個是設定值,一個是獲取值。
建構函式:
定義格式:class 類名稱{
訪問許可權 類名稱(型別1 引數1,型別2 引數2,…){
程式語句;
}
}
特點:
- 1 函式名與類名相同。
- 2 不用定義返回值型別。
- 3 不可以寫return語句。
作用:
給物件初始化。
注意:- 預設建構函式的特點。
- 當一個類中沒有定義建構函式時,那麼系統會給該類加入一個空引數的建構函式。
- 當在類中自定義了建構函式之後,預設的建構函式就沒有了
- 多個建構函式式以過載的形式存在的。
- 建構函式是給不同的物件進行分別初始化。
- 如果類被public修飾,那麼預設的建構函式也帶public修飾符。
- 如果類沒有被public修飾,那麼預設的建構函式,也沒有public修飾。
- 預設構造建構函式的許可權是隨著的類的變化而變化的。
- 建構函式和一般函式在寫法上有不同。
- 在執行上也有不同:建構函式是在物件一建立就執行。給物件初始化。而一般方法是物件呼叫才執行,是給物件新增物件具備的功能。
- 一個物件建立,建構函式只執行一次。而一般方法可以被物件呼叫多次。
- 當分析事物時,該事物存在具備一些特性或者行為,那麼將這些內容定義在建構函式中。
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(靜態)
用法:- 是一個修飾符,用於修飾成員(成員變數,成員函式)。
- 當成員被靜態修飾後,就多了一個呼叫方式,除了可以被物件呼叫外,
- 還可以直接被類名呼叫。類名.靜態成員。
- 隨著類的載入而載入 。
- 當類載入到記憶體中時,static所修飾的成員就已經在記憶體中(方法區,共享區,資料區)開闢好了空間。
- 也就是說靜態會隨著類的消失而消失,生命週期最長。
- 優先於物件存在。靜態是先存在的,物件後存在。
- 被所有物件所共享。
- 可以直接被類名所呼叫。 類名.靜態成員。
- 存放位置:
- 例項變數:隨著物件的建立而存在於堆記憶體中。
- 類變數:隨著類的載入而存在於方法去中。
- 生命週期:
- 例項變數:生命週期隨著物件的消失而消失。
- 類變數:生命週期最長,隨著類的消失而消失。
- 靜態方法只能訪問靜態成員(成員變數,成員函式).。非靜態方法可以訪問靜態,也可以訪問非靜態。
- 靜態方法中不可以定義this,super關鍵字。因為靜態優先於物件存在,所以靜態方法中不可以出現this,super關鍵字。
- 主函式是靜態的。
- 利處:對物件共性資料進行單獨空間儲存,節省記憶體空間。沒有必要每個物件中都儲存一份,可以直接用類名呼叫。
- 弊端:生命週期過長,訪問出現侷限性,靜態成員只能訪問靜態。
- 什麼時候定義靜態變數(類變數)
- 當物件中出現共享資料時,該資料被靜態所修飾。物件中的特有資料要定義成非靜態存在於堆記憶體中。
- 什麼時候定義靜態函式
- 當功能內部沒有訪問到非靜態資料(物件的特有資料),那麼這時該函式(功能)可以定義成靜態。
-
就是一個有靜態關鍵字標示的一個程式碼塊區域。定義在類中。
- 格式:
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