1. 程式人生 > >javaSE之面向物件程式設計->類與物件(上)——1 and 2

javaSE之面向物件程式設計->類與物件(上)——1 and 2

一、面向物件程式設計的簡介
在C語言的學習中我們所有的程式風格都是面向過程的,也就是比如兩個數相加這個程式段需要多次執行那麼我們在C語言中只能通過程式碼的賦值貼上才可以辦到,但是我們在面向過程程式設計裡面也有這樣類似的思想,就是函式。在java中我們採用面向物件的方法,就是可以將程式碼的可重用性提高。
1.面向物件的三大特徵:
(1)封裝性:封裝分為兩個步驟。首先是抽象,所謂抽象就是對現實生活中一個比較大的概念抽象為比較具體的一個描述;比如說人類,它就屬於一個抽象的類。當把類抽象出來了以後就進行封裝,將這個類的一些屬性和行為進行封裝,封裝以後將這些屬性和方法可以只讓一些可信的類進行訪問操作,這樣就提高了安全性。
(2)繼承性:繼承和我們人類也很相似,你和你的父母之間就有繼承的關係,這樣的關係使得你一出生就擁有了你自己特有的屬性和方法。 對於java中的語言也是一樣的,每一個類之間也可以通過繼承,獲得當前類的所有屬性,不需要重新來編寫一次這樣的程式碼。
(3)多型性:一個類它有多個屬性和行為,但是這些屬性和行為需要實現那麼就得通過建立這個類對應的物件來實現。一個類可以同時建立很多個物件分別是實現不同的行為和屬性,所以這也也就體現了多型性。
2.名詞擴充套件
OOA:面向物件分析
OOD:面向物件設計
OOP:面向物件程式設計
面向物件最大的特徵

:可以進行生活的抽象
二.類與物件的定義與使用
1.類與物件的定義:首先我們來討論討論什麼是類與物件。舉個例子,用人類和人來解釋類與物件;我們每個人不叫人類,但是我們屬於人類,人類是一個比較抽象的概念,說人類你的腦海裡面沒有什麼具體的描述,但是如果說某個具體的人你肯定知道他的體態特徵,人就是人類的一個具體,而人類就是人的一個抽象。生活中還有許多這樣的例子,比如電腦和hp膝上型電腦、女朋友和物件等等。這些例子都告訴我們物件是類的具體,類是物件的抽象。首先產生的是類(類是生產物件的藍圖),然後才可以產生物件,物件所有的行為,一定在類中進行了完整定義。
2.類的組成
方法(操作的行為)
屬性(變數,描述每個物件的具體特點)
3.類與物件的定義與使用
定義一個類 :
class 類名{
屬性1;
屬性2;
……
方法1(){
}
方法2(){
}
……
}
例子(建立一個人類):

//屬性
public class Person{
private String name;
private int age;
private String gender;
//方法
String personInfo(){
return "這個人是"+name+"年齡為"+age+"性別是"+gender;
}
//構造方法,建立物件
public Person(String name,int age,String gender){
this.name=name;
this.age=age;
this.gender=gender;
}
}

有了類我們就可以產生物件了,如下:
類名 物件名 = new 類名();

Person person 1= new Person();//建立一個物件
Person person2 = new Person("Alice",18,"女");//又建立了一個物件

通過物件呼叫例項變數與例項方法:

Person person2 = new Person("Alice",18,"女");
System.out.print(person2.personInfo);
System.out.println(person.name);

注意:只要出現了關鍵字new就是建立了物件(即開闢了空間);在java中,所謂的效能評優,調整的就是記憶體問題。
4.物件記憶體
在C語言中我們的記憶體分配一共有很多個層次:
從最底層的程式碼區——》未初始化全域性變數區——》已初始化全域性變數區——》堆區——》共享區——》棧區;但是在java中我們的記憶體區域大體首先分為棧記憶體和堆記憶體裡兩個區域。
在這裡插入圖片描述
接下來通過程式碼和記憶體之間的關聯來解釋記憶體。
(1)建立一個物件時棧記憶體與堆記憶體的關係
程式碼:

class Person2{
	String name;
	int age;
}
 public class Test{
	 public static void main(String[] args){
		 //建立物件1
	1-》	 Person2 per1 = new Person2();
	2-》	 per1.name="張三";
	3-》	 per1.age=14;
	 }
 }

執行完1以後:
在這裡插入圖片描述
在棧中開闢了空間放per1名字(即是per1堆記憶體的地址),在堆中也開闢了相應的空間,堆中開闢的空間放的是Person物件的name、age屬性,並且此時都為各自型別的預設值。
接著執行2、3語句:
在這裡插入圖片描述
執行2、3語句後,就堆中的屬性進行賦值,將預設值覆蓋掉,變為現在的值。
注意:int age,String name都是物件的屬性,雖然是基本資料型別修飾的,但是屬於引用型別,所以他們放在堆記憶體中。
(2)建立兩個物件

class Person2{
	String name;
	int age;
}
 public class Test{
	 public static void main(String[] args){
		 //建立物件1
	1-》	 Person2 per1 = new Person2();
	2-》	 per1.name="張三";
	3-》	 per1.age=14;
		 //建立物件2
	4-》 Person2 per2 = new Person2();
	5-》 per1.name="李四";
	6-》 per1.age=15;
	 }
 }

執行完1、2、3
在這裡插入圖片描述
建立完第一個物件以後在堆記憶體開闢了自己的相應空間。
執行完4、5、6
在這裡插入圖片描述
建立完第二個物件以後在堆記憶體開闢了自己的相應空間。
(3)看起來像建立了兩個物件,實際上只建立了一個物件

class Person2{
	String name;
	int age;
}
 public class Test{
	 public static void main(String[] args){
		 //建立物件1
		1-》 Person2 per1 = new Person2();
		 2-》per1.name="張三";
		 3-》per1.age=14;
		 4-》Person2 per2 = per1;
	 }
 }

執行完1、2、3
在這裡插入圖片描述
new->開闢了一個空間
執行完4
在這裡插入圖片描述
雖然是在棧記憶體裡有per2,但是我們是將per1指向堆記憶體的地址賦值給了per2;所以實質上只建立了一個物件,只是有棧裡面有兩個變數指向它。
當我們執行per1=null,那麼它將不再指向相應的堆記憶體,但此時還有一個物件指向這個堆記憶體,所以不會被垃圾回收站回收。
注意:
(1)建立一個物件一定是相應的在堆上開闢一個空間。
(2)區分一下兩種建立物件的方法:
1->Person person;
2->Person person=null;
1->表示宣告物件,編譯的時候不能通過;
2->表示宣告物件並且給物件初始化,它不是指向堆中的某個指定的空間,它是指向null,它的編譯可以通過。
(3)物件(引用資料型別)必須在例項化以後呼叫,否則會產生NullPointerException(執行時出錯),編譯可以通過。–》即表示引用變數是否初始化。
(4)所有垃圾空間會不定期的被垃圾回收站(GC),回收,但GC會影響效能,所以在開發之中,儘量減少自己的無用物件。