《Android游戏开发详解》一3.1 构造方法
本節書摘來異步社區《Android游戲開發詳解》一書中的第3章,第3.1節,作者: 【美】Jonathan S. Harbour 譯者: 李強 責編: 陳冀康,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
3.1 構造方法
Android游戲開發詳解
通過回顧第2章中的重要概念并且做一些小的修改,我們可以更容易地進入較為復雜的主題。首先創建一個名為Constructors的項目,并且創建一個World類,如程序清單3.1所示。
程序清單3.1 World.java
1 public class World { 2 3 public static void main(String[] args) { 4 5 6 } 7 8 }我們還將創建一個名為Coder的類,如程序清單3.2所示。
程序清單3.2 Coder.java
1 public class Coder { 2 private String name; 3 private int age; 4 5 public void initialize(String name, int age) { 6 this.name = name; 7 this.age = age; 8 } 9 10 public void writeCode() { 11 System.out.println(name + " is coding!"); 12 } 13 14 public void describe() { 15 System.out.println("I am a coder"); 16 System.out.println("My name is " + name); 17 System.out.println("I am " + age + " years old"); 18 } 19 20 }現在,你的項目應該如圖3-1所示。
在繼續學習之前,要確保理解Coder類。Coder.java是創建Coder對象的藍圖。在這個藍圖中,我們已經聲明了一個Coder對象,它應該有2個變量描述其狀態:表示name的一個String,以及表示age的一個整數。
和其他對象一樣,我們的Coder對象也有行為。initialize()方法允許我們使用所提供的值來初始化Coder對象的實例變量。writeCode()方法將打印出文本,表明Coder對象正在編碼。describe()方法將直接以容易理解的形式列出所有實例變量的值。
3.1.1 變量接受默認值
回到World類,創建Coder對象的一個實例,并且讓它描述自己。代碼應該如程序清單3.3所示。
程序清單3.3 World.java (更新版)
1 public class World { 2 3 public static void main(String[] args) { 4 Coder c = new Coder(); 5 c.describe(); 6 } 7 8 }當我們初次聲明新的Coder對象的時候,其實例變量還沒有初始化(意味著,它們為每個變量類型都保留了默認值)。運行該World類,將會得到如下所示的輸出。
I am a coder My name is null I am 0 years old正如上面的結果所示,int的默認值是0。一個空的對象引用變量(指向一個對象的一個變量)的默認值為null,這意味著“沒有內容”。這直接意味著對象引用變量沒有包含任何值。如圖3-2所示。
3.1.2 避免Java異常
在繼續學習之前,我們想要指出導致很多Java程序意外終止的一個常見錯誤,即NullPointerException。當你試圖調用屬于一個null對象變量的一個方法的時候,就會發生這種運行時錯誤(在程序執行的時候發生的錯誤)。看看下面的例子。
String a; // Equivalent to String a = null; a.length();如果你要在main方法中運行這段代碼,將會得到如下所示的錯誤(帶有出錯的地方的行號)。
Exception in thread "main" java.lang.NullPointerException無論何時,當你遇到這條錯誤消息,解決方法是找到所有的對象變量,并且使用null值來初始化它們。
3.1.3 使用方法來初始化Code對象
要避免任何潛在的NullPointerExceptions,我們現在使用initialize()方法來初始化新的Coder類的實例變量(如程序清單3.4的第7行所示)。
程序清單3.4 初始化Coder及其實例變量
1 public class World { 2 3 public static void main(String[] args) { 4 Coder c = new Coder(); // Initializes the variable c 5 c.describe(); 6 System.out.println(""); // insert empty line for readability 7 c.initialize("Bill", 59); // Initializes c’s instance variables 8 c.describe(); 9 } 10 11 }當我們運行程序清單3.4的時候,將會得到如下所示的輸出。
I am a coder My name is null I am 0 years old I am a coder My name is Bill I am 59 years old3.1.4 使用定制的構造方法來初始化Coder對象
在前面的小節中,我們已經學習了使用如下所示的語法來創建對象。
Coder c = new Coder();上面代碼的new Coder()部分,展示了如何調用所謂的默認構造(default constructor)方法,該方法直接創建了Coder對象的一個實例,以供我們在變量c中使用它。
Java還允許使用定制的構造方法,它就像普通方法一樣,可以接受供該對象使用的值。為了看看這是如何起作用的,我們先關注如下兩行代碼。
Coder c = new Coder(); // Uses the default constructor ... c.initialize(“Bill”, 59);定制的構造方法允許我們將代碼簡化成如下所示的形式。
Coder c = new Coder(“Bill”, 59);為了做到這一點,我們必須先在Coder類中聲明想要的定制構造方法,如下所示。
public Coder(String name, int age) {this.name = name; this.age = age; }構造方法看上去和方法類似,但是實際上有很大的不同。首先,構造方法沒有返回類型(甚至不是void)。其次,構造方法的名稱必須和包含它的類相同。
盡管有這些不同,注意我們的構造方法接受了參數,并且像initialize()方法那樣將它們分配給Coder對象的實例變量。
現在,我們可以將這個構造方法添加到Coder類中,并且刪除initialize()方法,如下所示。
public class Coder {private String name; private int age; public Coder(String name, int age) {this.name = name; this.age = age; }publicvoid initialize(String name, int age) { this.name = name; this.age = age; }public void writeCode() {System.out.println(name + " is coding!");}public void describe() {System.out.println("I am a coder");System.out.println("My name is " + name);System.out.println("I am " + age + " years old");}}可以認為構造方法是必需的,這是創建對象的一條規則。這好像是在說:“如果想要創建我的對象,你必須傳遞我所要求的輸入。”
在創建自己的構造方法的時候,你只是明確了當沒有提供Coder對象的name和age的時候,是不能夠創建它的。因此,不能使用下面的語法創建一個Coder對象。
Coder c = new Coder(); // no longer works!讓我們對World類做一些修改,以反映這些變化,如程序清單3.5所示。
程序清單3.5 調用定制的構造方法
public class World {public static void main(String[] args) { Coder c = new Coder(); c.describe(); System.out.println(""); // insert empty line for readability c.initialize("Bill", 59);Coder c = new Coder("Bill", 59);c.describe();} }運行這段代碼,將會得到如下所示的輸出。
I am a coder My name is Bill I am 59 years old關鍵知識點
對象構造方法
- 構造方法提供了一種方法,在創建對象的過程中初始化對象中的實例變量。
- 構造方法和關鍵字new一起使用。
- 如果你選擇不創建構造方法的話,Java會提供一個默認的構造方法。
- 所有的構造方法必須以類的名稱來命名。
- 可以有任意多個構造方法,但是,每個構造方法必須有不同的一組參數。
總結
以上是生活随笔為你收集整理的《Android游戏开发详解》一3.1 构造方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析 Linux 初始化 init 系统
- 下一篇: Bash 中的特殊字符大全