Java培訓教程之物件的建立與使用

千鋒武漢發表於2021-06-22

  本文小千分享Java物件導向中的物件建立與使用。類是物件的抽象,為物件定義了屬性和行為,但類本身既不帶任何資料,也不存在於記憶體空間中。而物件是類的一個具體存在,既擁有獨立的記憶體空間,也存在獨特的屬性和行為,屬性還可以隨著自身的行為而發生改變。接下來演示如何用類建立物件,建立物件之前,必須先宣告物件,其語法格式如下:

  類名 物件名;

  類是自定義型別,也是一種引用型別,因此該物件名是一個引用變數,預設值為null,表示不指向任何堆記憶體空間。接下來需要對該變數進行初始化,Java使用new關鍵字來建立物件,也稱例項化物件,其語法格式如下:

  物件名 = new 類名();

  上述示例中,使用new關鍵字在堆記憶體中建立類的物件,物件名引用此物件。宣告和例項化物件的過程可以簡化,其語法格式如下:

  類名 物件名 = new 類名();

  接下來演示建立Person類的例項物件,具體示例如下:

  Person p = new Person();

  上述示例中,“Person p”宣告瞭一個Person型別的引用變數,“new Person()”為物件在堆中分配記憶體空間,最終返回物件的引用並賦值給變數p,如圖4.1所示。

圖片1

  圖4.1 物件p在記憶體中的示意圖

  物件例項化後,就可以訪問物件的成員變數和成員方法,其語法格式如下:

  物件名.成員變數;

  物件名.成員方法();

  接下來透過一個案例來學習訪問物件的成員變數和呼叫物件的成員方法,如例4-1所示。

  例4-1 TestPersonDemo.java

  1 class Person {

  2 String name; // 宣告姓名屬性

  3 int age; // 宣告年齡屬性

  4 public void say() { // 定義顯示資訊的方法

  5 System.out.println("姓名:"+name+",年齡:"+age);

  6 }

  7 }

  8 public class TestPersonDemo {

  9 public static void main(String[] args) {

  10 Person p1 = new Person(); // 例項化第一個Person物件

  11 Person p2 = new Person(); // 例項化第二個Person物件

  12 p1.name = "張三"; // 為name屬性賦值

  13 p1.age = 18; // 為age屬性賦值

  14 p1.say(); // 呼叫物件的方法

  15 p2.say();

  16 }

  17 }

  程式的執行結果如圖4.2所示。

圖片2

  圖4.2 例4-1執行結果

  例4-1中,例項化了兩個Person物件,並透過“物件.屬性”的方式為成員變數賦值,透過“物件.方法”的方式呼叫成員方法。從執行結果可發現,變數p1、p2引用的物件同時呼叫了say()方法,但輸出結果卻不相同。這是因為用new建立物件時,會為每個物件開闢獨立的堆記憶體空間,用於儲存物件成員變數的值。因此,對變數p1引用的物件屬性賦值並不會影響變數p2引用物件屬性的值。為了更好地理解,變數p1、p2引用物件的記憶體狀態如圖4.3所示。

圖片3

  圖4.3 物件的記憶體關係

  例4-1中沒有為p2物件的成員變數賦值,但從圖4.3中可發現,p2物件的name值為null,age值為0。這是因為在例項化物件時,Java虛擬機器會自動為成員變數進行初始化,根據成員變數的型別賦相對應的初始值。

  另外,需要注意的是,一個物件能被多個變數所引用,當物件不被任何變數所引用時,該物件就會成為垃圾,不能再被使用。接下來演示垃圾是如何產生的,如例4-2所示。

  例4-2 TestObjectRef.java

  1 class Person {

  2 String name; // 宣告姓名屬性

  3 int age; // 宣告年齡屬性

  4 public void say() { // 定義顯示資訊的方法

  5 System.out.println("姓名:"+name+",年齡:"+age);

  6 }

  7 }

  8 public class TestObjectRef {

  9 public static void main(String[] args) {

  10 Person p1 = new Person(); // 例項化第一個Person物件

  11 Person p2 = new Person(); // 例項化第二個Person物件

  12 p1.name = "張三"; // 為p1物件name屬性賦值

  13 p1.age = 18; // 為p1物件age屬性賦值

  14 p2.name = "李四"; // 為p2物件name屬性賦值

  15 p2.age = 28; // 為p2物件age屬性賦值

  16 p2 = p1; // 將p1物件傳遞給p2物件

  17 p1.say(); // 呼叫物件的方法

  18 p2.say();

  19 }

  20 }

  程式的執行結果如圖4.4所示。

圖片4

  圖4.4 例4-2執行結果

  例4-3中,第16行程式碼p2被賦值為p1後,會斷開原有引用的物件,而和p1引用同一物件。因此列印如圖4.6所示結果。此時,p2原有引用的物件不再被任何變數所引用,就成了垃圾物件,不能再被使用,只等待垃圾回收機制進行回收。垃圾產生的過程,如圖4.5所示。

圖片5

  圖4.5 垃圾物件的產生

  圖4.5中,首先例項化兩個物件p1和p2,其次分別為p1和p2的屬性賦值,最後將p2從新賦值為p1,p2將斷開原有引用,此時被斷開引用的物件,也不被其他引用變數所引用,就成為垃圾空間,等待被回收。

  希望以上的分享能幫到大家!本文來自千鋒教育,轉載請註明出處。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2777736/,如需轉載,請註明出處,否則將追究法律責任。

相關文章