本章節(jié)目標(biāo):
理解構(gòu)造方法以及重載機(jī)制,通過構(gòu)造方法可以完成對(duì)象的創(chuàng)建,并且能夠通過引用訪問對(duì)象的內(nèi)存,了解Java虛擬機(jī)內(nèi)存管理,能夠畫出程序執(zhí)行過程的內(nèi)存圖,并了解空指針異常是如何發(fā)生的,以及方法調(diào)用時(shí)參數(shù)是如何傳遞的。
Java對(duì)象的創(chuàng)建和使用方法
類定義之后,就可以使用類這個(gè)“模板”來(lái)創(chuàng)造“對(duì)象”了,一個(gè)類是可以創(chuàng)建多個(gè)對(duì)象的哦!怎么創(chuàng)建呢,語(yǔ)法是什么?其實(shí)語(yǔ)法格式很簡(jiǎn)單:new 類名(),這樣就可以完成對(duì)象的創(chuàng)建了。俗話說,你想要什么java都可以給你,想要啥你就new啥。請(qǐng)看下面代碼:
public class StudentTest {
public static void main(String[] args) {
//創(chuàng)建一個(gè)學(xué)生對(duì)象
new Student();
//再創(chuàng)建一個(gè)學(xué)生對(duì)象
new Student();
}
}
為了使用對(duì)象更加方便,建議使用變量接收一下?例如以下代碼:
public class StudentTest {
public static void main(String[] args) {
//創(chuàng)建一個(gè)學(xué)生對(duì)象
Student s1 = new Student();
//再創(chuàng)建一個(gè)學(xué)生對(duì)象
Student s2 = new Student();
//以上代碼其實(shí)和這行代碼差不多
int i = 10;
}
}
以上代碼最初接觸的時(shí)候,大家肯定會(huì)感覺非常陌生,這也是正常的,Student s1 = new Student()實(shí)際上和int i = 10是類似的,對(duì)于int i = 10來(lái)說,int是一種基本數(shù)據(jù)類型,i是變量名,10是int類型的字面量。那對(duì)于Student s1 = new Student()來(lái)說,其中Student是一種引用數(shù)據(jù)類型,s1是變量名,new Student()執(zhí)行之后是一個(gè)Student類型的對(duì)象。
大家要注意了,java語(yǔ)言當(dāng)中凡是使用class關(guān)鍵字定義的類都屬于引用數(shù)據(jù)類型,類名本身就是這種引用數(shù)據(jù)類型的類型名。創(chuàng)建了對(duì)象之后怎么去訪問這個(gè)對(duì)象的屬性呢,或者說學(xué)生對(duì)象現(xiàn)在有了,怎么去訪問他的學(xué)號(hào)、姓名、性別、年齡等信息呢。請(qǐng)看以下代碼:
public class StudentTest {
public static void main(String[] args) {
//創(chuàng)建一個(gè)學(xué)生對(duì)象
Student s1 = new Student();
//再創(chuàng)建一個(gè)學(xué)生對(duì)象
Student s2 = new Student();
//以上代碼其實(shí)和這行代碼差不多
int i = 10;
int no1 = s1.no;
System.out.println("學(xué)號(hào):" + no1);
String name1 = s1.name;
System.out.println("姓名:" + name1);
int age1 = s1.age;
System.out.println("年齡:" + age1);
boolean sex1 = s1.sex;
System.out.println("性別:" + sex1);
int no2 = s2.no;
System.out.println("學(xué)號(hào):" + no2);
String name2 = s2.name;
System.out.println("姓名:" + name2);
int age2 = s2.age;
System.out.println("年齡:" + age2);
boolean sex2 = s2.sex;
System.out.println("性別:" + sex2);
//當(dāng)然,也可以不使用no1,no2這樣的變量接收
System.out.println("學(xué)號(hào) = " + s1.no);
System.out.println("姓名 = " + s1.name);
System.out.println("年齡 = " + s1.age);
System.out.println("性別 = " + s1.sex);
System.out.println("學(xué)號(hào) = " + s2.no);
System.out.println("姓名 = " + s2.name);
System.out.println("年齡 = " + s2.age);
System.out.println("性別 = " + s2.sex);
}
}
運(yùn)行結(jié)果如下圖所示:
圖9-1:對(duì)象的創(chuàng)建和使用
接下來(lái)解釋一下以上的輸出結(jié)果,通過以上的Student類可以創(chuàng)建很多學(xué)生對(duì)象,假設(shè)通過Student類實(shí)例化了兩個(gè)學(xué)生對(duì)象,那必然會(huì)有兩個(gè)不同的學(xué)號(hào),以上程序中并沒有給學(xué)號(hào)賦值,但是獲取了到的學(xué)號(hào)都是0,這是怎么回事呢?這是因?yàn)樵趈ava語(yǔ)言當(dāng)中,當(dāng)實(shí)例變量沒有手動(dòng)賦值,在創(chuàng)建對(duì)象的時(shí)候,也就是說在new的時(shí)候,系統(tǒng)會(huì)對(duì)實(shí)例變量默認(rèn)賦值,它們的默認(rèn)值請(qǐng)參考下表:
|
數(shù)據(jù)類型 |
默認(rèn)值 |
|
byte |
0 |
|
short |
0 |
|
int |
0 |
|
long |
0L |
|
float |
0.0f |
|
double |
0.0 |
|
boolean |
false |
|
char |
\u0000 |
|
引用類型 |
null |