1. 程式人生 > >JavaSE之面向物件程式設計(上)

JavaSE之面向物件程式設計(上)

Java語言的三大特性:平臺無關係、安全性、網路移動性。Java是面向物件的程式語言,Java的三大特性與面向物件的封裝、繼承、多型、抽象有著千絲萬縷的關係。
1.封裝
封裝是一種資訊隱蔽技術,就是把屬性私有化,提供公共方法訪問私有物件。封裝還指把物件的屬性和行為看成是一個密不可分的整體。
封裝的優點:
隱藏類的實現細節
在setter函式中加入控制邏輯,限制對屬性的不合理操作
便於修改,增強程式碼的可維護性

類與物件的關係

類是具有相同屬性和方法的一組物件的集合,成員變數是類的屬性,反映物件的狀態;成員方法是類的行為,反映對屬性的操作。物件是實際存在該類事物的個體。物件是以類為模板建立的,或者說物件是以類為藍圖例項化的

物件與例項的不同點:在類中,一般會定義類的成員,包括變數和方法。在Java記憶體分配中,物件(類中的屬性)是儲存在堆記憶體中,例項(可理解為物件名稱)儲存在棧記憶體中,例項只是一個物件的引用,就是物件的指標(地址)。只能通過例項操作物件,並不能直接操作物件。例項變數和例項方法又合稱例項成員,例項成員只屬於例項,不屬於整個類。

類的定義語法:

訪問控制符 [修飾符] class 類名{
      訪問控制符 [修飾符] 資料型別 屬性1;
      訪問控制符 [修飾符] 資料型別 屬性2;
      ......
        訪問控制符 [修飾符]  返回值的資料型別 方法名稱(引數1,引數2....){
            方法語句;
            [return 返回值;]
        }
}

訪問控制符:用於限定宣告的類在大多數範圍內可以被其他類訪問,主要有預設訪問控制符(無關鍵字)和public
修飾符:用於增強類的功能,使宣告的類具有某種特性建立的修飾符有abstract、static、final等
class:類定義時使用的關鍵字
類名:採用大駝峰命名法,且檔名(字尾為.java)要與主類名相同
eg:

public calss Person{
String name;
int name;
public void say(){
System.out.println("我的名字叫"+name+"我今年"+age+"歲了");
}
}

建立好一個類後,想要使用該類,就需要建立物件

物件的建立:

類名 物件名稱1 = new 類名();
類名 物件名稱=null;
物件名稱=new 類名();

類是一種引用資料型別,與陣列是相同的的,以此兩者在記憶體的分配上也有相似性。
例如Person類有兩個屬性,name和age都需要存入記憶體中,當程式執行到 Person p1時,Java會在棧記憶體中開闢一個空間給物件p1,執行到p1=new Person();時,Java會在堆記憶體開闢空間儲存物件p1的屬性。
因此棧記憶體(虛擬機器區域性變量表):存放的是區域性變數(包含編譯期可知的各種基本資料型,物件引用,即物件的名稱,儲存的堆記憶體的地址)Java棧與執行緒相對應,每建立一個執行緒,JVM就會為執行緒建立一個對應的Java棧。

只要出現了關鍵字NEW,表明在堆上分配了記憶體並且產生了Person類的物件來引用這部分記憶體。
物件(引用資料型別)必須在例項化後呼叫,否則會產生NullException(執行時錯誤,編譯可以通過,只有引用資料型別才會產生此類異常)
引用傳遞分析:
引用傳遞的本質:同一片堆記憶體被多個棧所指向,並且都可以更改堆記憶體中的值。

private實現封裝處理

使用private關鍵字對類中的屬性進行隱藏,這樣就只能在本類中訪問屬性,其他類無法訪問。因此可以使用setter方法和getter方法訪問使用物件的私有屬性。
eg:

public void setAge(int age){
	if(age>0&&age<120){
		
		this.age=age;
	}
}
 public String getName(){
	 
	 return name;
 }	

在程式中,set方法的形參與類的資料成員同名,get方法的宣告中,返回值的資料型別要與資料成員型別對應。
當一個屬性不希望外部更改時,則不提供set方法,使用構造方法對屬性初始化(只有使用new關鍵字例項化物件時,才會呼叫建構函式)。

構造方法的定義遵循的原則:
1.方法名稱與類名相同
2.構造方法中沒有返回值型別宣告。
3.每一個類中至少存在一個構造方法,若不格外定義,系統自動生成一個無參的建構函式。
4.構造方法引數可以不同,即可以構造方法過載。
5.構造方法不能被static abstract native synchronized修飾
6.構造方法的訪問修飾符與所在類的訪問修飾符一致,若類是public,那麼預設的構造方法也是public,若類是無訪問修飾符的,那麼他的預設構造方法也是沒有訪問修飾符的。
eg:

public Person(){
	System.out.println("********產生一個新的Person無參物件********");
	
	
}
public Person(String name){
	
	this.name=name;
	System.out.println("*********產生一個新的Person一個引數物件********");
	
}
public Person(String name,int age){
	this(name);  //this呼叫本類方法(前面只有一個引數的構造方法)
	this.age=age;
	//System.out.println("*********產生一個新的Person兩個引數物件********");
}

注: 可以建立私有的構造方法
在23種設計模式中,就在存在一種單例設計模式,其中就是將構造方法宣告為private,因此就不能通過構造方法建立物件,從而保證單例設計模式只有一個例項,在其需要獲得類的例項時,可以類似於獲得私有屬性一樣,寫一個getter方法,通過呼叫該靜態getter方法獲得類的例項。

匿名物件
匿名物件是沒有棧空間的物件,通過關鍵字NEW開闢,只能使用一次,使用完後會等待JVM垃圾回收器收集