《Java從小白到大牛》之第11章 對象

《Java從小白到大牛》紙質版已經上架了!!!
Java從小白到大牛書皮html

類實例化可生成對象,實例方法就是對象方法,實例變量就是對象屬性。一個對象的生命週期包括三個階段:建立、使用和銷燬。前面章節已經多少用到了對象,這一章詳細介紹一下對象的建立和銷燬等相關知識。java

建立對象

建立對象包括兩個步驟:聲明和實例化。程序員

1. 聲明設計模式

聲明對象與聲明普通變量沒有區別,語法格式以下:數組

type objectName;

其中type是引用類型,即類、接口和數組。示例代碼以下:app

String name;

該語句聲明瞭字符串類型對象name。能夠聲明並不爲對象分配內存空間,而只是分配一個引用。ide

2. 實例化學習

實例化過程分爲兩個階段:爲對象分配內存空間和初始化對象,首先使用new運算符爲對象分配內存空間,而後再調用構造方法初始化對象。示例代碼以下:ui

String name;

name = new String("Hello World");

代碼中String("Hello World")表達式就是調用String的構造方法。初始化完成以後如圖11-1所示。this

圖11-1 對象實例化

空對象

一個引用變量沒有經過new分配內存空間,這個對象就是空對象,Java使用關鍵字null表示空對象。示例代碼以下:

String name = null;

name = "Hello World";

引用變量默認值是null。當試圖調用一個空對象的實例變量或實例方法時,會拋出空指針異常NullPointerException,以下代碼所示:

String name = null;

//輸出null字符串

System.out.println(name);

//調用length()方法

int len = name.length(); ①

可是代碼運行到第①行時,系統會拋出異常。這是由於調用length()方法時,name是空對象。程序員應該避免調用空對象的成員變量和方法,代碼以下:

//判斷對象是否爲null

if (name != null) {

int len = name.length();

}

提示 產生空對象有兩種可能性:第一是程序員本身忘記了實例化,第二是空對象是別人傳遞給咱們的。第一種程序員必須防止這種狀況發生,應該仔細檢查本身的代碼,爲本身建立的全部對象進行實例化並初始化。第二種狀況須要經過判斷對象非null進行避免。

構造方法

在11.1節使用了表達式new String("Hello World"),其中String("Hello World")是調用構造方法。構造方法是類中特殊方法,用來初始化類的實例變量,這個就是構造方法,它在建立對象(new運算符)以後自動調用。

Java構造方法的特色:

  1. 構造方法名必須與類名相同。
  2. 構造方法沒有任何返回值,包括void。
  3. 構造方法只能與new運算符結合使用。

構造方法示例代碼以下:

//Rectangle.java文件

package com.a51work6;

// 矩形類

public class Rectangle {

// 矩形寬度

int width;

// 矩形高度

int height;

// 矩形面積

int area;

// 構造方法

public Rectangle(int w, int h) { ①

width = w;

height = h;

area = getArea(w, h);

}

...

}

代碼第①行是聲明瞭一個構造方法,其中有兩個參數w和h,用來初始化Rectangle對象的兩個成員變量width和height,注意前面沒有任何的返回值。

默認構造方法 {#-0}

有時在類中根本看不到任何的構造方法。例如本節中User類代碼以下:

//User.java文件

package com.a51work6;

public class User {

// 用戶名

private String username;

// 用戶密碼

private String password;

}

從上述User類代碼,只有兩個成員變量,看不到任何的構造方法,可是仍是能夠調用無參數的構造方法建立User對象,見以下代碼。

//HelloWorld.java文件

...

User user = new User();

Java虛擬機爲沒有構造方法的類,提供一個無參數的默認構造方法,默認構造方法其方法體內無任何語句,默認構造方法至關於以下代碼:

//默認構造方法

public User() {

}

默認構造方法的方法體內無任何語句,也就不可以初始化成員變量了,那麼這些成員變量就會使用默認值,成員變量默認值是與數據類型有關,具體內容能夠參考9.1.2節中的表9-1所示。這裏再也不贅述。

構造方法重載 {#-1}

在一個類中能夠有多個構造方法,它們具體有相同的名字(與類名相同),參數列表不一樣,因此它們之間必定是重載關係。

構造方法重載示例代碼以下:

//Person.java文件

package com.a51work6;

import java.util.Date;

public class Person {

// 名字

private String name;

// 年齡

private int age;

// 出生日期

private Date birthDate;

public Person(String n, int a, Date d) { ①

name = n;

age = a;

birthDate = d;

}

public Person(String n, int a) { ②

name = n;

age = a;

}

public Person(String n, Date d) { ③

name = n;

age = 30;

birthDate = d;

}

public Person(String n) { ④

name = n;

age = 30;

}

public String getInfo() {

StringBuilder sb = new StringBuilder();

sb.append("名字: ").append(name).append('\n');

sb.append("年齡: ").append(age).append('\n');

sb.append("出生日期: ").append(birthDate).append('\n');

return sb.toString();

}

}

上述代碼Person類代碼提供了4個重載的構造方法,若是有準確的姓名、年齡和出生日期信息,則能夠選用代碼第①行的構造方法建立Person對象;若是隻有姓名和年齡信息則可選用代碼第②行的構造方法建立Person對象;若是隻有姓名和出生日期信息則可選用代碼第③行的構造方法建立Person對象;若是隻有姓名信息則可選用代碼第④行的構造方法建立Person對象。

構造方法封裝 {#-2}

構造方法也能夠進行封裝,訪問級別與普通方法同樣,構造方法的訪問級別參考表11-1所示。示例代碼以下:

//Person.java文件

package com.a51work6;

import java.util.Date;

public class Person {

// 名字

private String name;

// 年齡

private int age;

// 出生日期

private Date birthDate;

// 公有級別限制

public Person(String n, int a, Date d) { ①

name = n;

age = a;

birthDate = d;

}

// 默認級別限制

Person(String n, int a) { ②

name = n;

age = a;

}

// 保護級別限制

protected Person(String n, Date d) { ③

name = n;

age = 30;

birthDate = d;

}

// 私有級別限制

private Person(String n) { ④

name = n;

age = 30;

}

...

}

上述代碼第①行是聲明公有級別的構造方法。代碼第②行是聲明默認級別,默認級別只能在同一個包中訪問。代碼第③行是保護級別的構造方法,該構造方法在同一包中與默認級別相同,在不一樣包中能夠被子類繼承。代碼第④行是私有級別構造方法,該構造方法只能在當前類中使用,不容許在外邊訪問,私有構造方法能夠應用於單例設計模式^10等設計。

this關鍵字 {#this}

前面章節中使用過this關鍵字,this指向對象自己,一個類能夠經過this來得到一個表明它自身的對象變量。this使用在以下三種狀況中:

  • 調用實例變量。
  • 調用實例方法。
  • 調用其餘構造方法。

使用this變量的示例代碼:

//Person.java文件

package com.a51work6;

import java.util.Date;

public class Person {

// 名字

private String name;

// 年齡

private int age;

// 出生日期

private Date birthDate;

// 三個參數構造方法

public Person(String name, int age, Date d) { ①

this.name = name; ②

this.age = age; ③

birthDate = d;

System.out.println(this.toString()); ④

}

public Person(String name, int age) {

// 調用三個參數構造方法

this(name, age, null); ⑤

}

public Person(String name, Date d) {

// 調用三個參數構造方法

this(name, 30, d); ⑥

}

public Person(String name) {

// System.out.println(this.toString());

// 調用Person(String name, Date d)構造方法

this(name, null); ⑦

}

@Override

public String toString() {

return "Person [name=" + name ⑧

+ ", age=" + age ⑨

+ ", birthDate=" + birthDate + "]";

}

}

上述代碼中屢次用到了this關鍵字,下面詳細分析一下。代碼第①行聲明三個參數構造方法,其中參數name和age與實例變量name和age命名衝突,參數是做用域爲整個方法的局部變量,爲了防止局部變量與成員變量命名發生衝突,可使用this調用局部變量,見代碼第②行和第③行。注意代碼第⑧行和第⑨行的name和age變量沒有衝突,因此能夠不使用this調用。

this也能夠調用本對象的方法,見代碼第④行的this.toString()語句,這本例中this能夠省略。

在多個構造方法重載時,一個構造方法能夠調用其餘的構造方法,這樣能夠減小代碼量,上述代碼第⑤行this(name, age, null)使用this調用其餘構造方法。相似調用還有代碼第⑥行的this(name, 30, d)和第⑦行的this(name, null)。

注意 使用this調用其餘構造方法時,this語句必定是該構造方法的第一條語句。例如在代碼第⑦行以前調用toString()方法則會發生錯誤。

對象銷燬

對象再也不使用時應該銷燬。C++語言對象是經過delete語句手動釋放,Java語言對象是由垃圾回收器(Garbage Collection)收集而後釋放,程序員不用關係釋放的細節。自動內存管理是現代計算機語言發展趨勢,例如:C#語言的垃圾回收,Objective-C和Swift語言的ARC(內存自動引用計數管理)。

垃圾回收器(Garbage Collection)的工做原理是:當一個對象的引用不存在時,認爲該對象再也不須要,垃圾回收器自動掃描對象的動態內存區,把沒有引用的對象做爲垃圾收集起來並釋放。

本章小結

經過對本章的學習,能夠了解如何建立Java對象,理解構造方法的做用。此外,還介紹了this關鍵的使用。

配套視頻

http://edu.51cto.com/topic/1246.html

配套源代碼

http://www.zhijieketang.com/group/5

相關文章
相關標籤/搜索