單元目標
1. 宣告,實例化及初始化物件
2. 比較相對於"基本變數(shù)"來說,"物件參考變數(shù)"如何存在於記憶體之中
3. 使用String 類別
宣告,實例化及初始化物件
語法:
ClassName identifier = new ClassName();
ClassName : 指新物件所要參考的類別
identifier : 變數(shù)名稱
new : new將從類別中建立物件實體
ClassName : 新物件的類別
H : 我知道光看上面很難看懂,或許看看實例會比較有幫助.
實例:
public class Employee
{
public int id;
public void info()
{
System.out.println(id);
}
}
public class EmployeeTest
{
public static void main(String[] args)
{
Employee emp = new Employee();
/*我建了一個叫emp的變數(shù) , 這個emp變數(shù)是參考
Employee類別 , 所以接下來 emp 變數(shù)可以套用 id
這個名稱 , 並指派1這個值 , 而1這個值將會被代入
Employee 類別的id 變數(shù)內(nèi).*/
emp.id=1;
}
}
H : 如果真的還是搞不懂 , 那就想成如果兩個類別之間要共用同一個變數(shù),
則必須進行"宣告與初始化物件參考"的行為. "宣告與初始化物件參考"
就是上面講的那段語法. 完成上面的動作,才可以將資料或是數(shù)值帶入新的變數(shù)之中.
使用String物件
String是一個物件,能提供儲存一連串的字元.至於它該如何使用? 請看下面的說明.
1. 使用new 關(guān)鍵字建立String物件
我們可以使用new關(guān)鍵字來建立並初始化String物件,並同時定義一串字元給它作為初始化.
例如 : String myName = new String("HHH");
[型別] [變數(shù)] [新建][物件] [指派的字串]
上面的例子是,我們使用了new來建立一個新的String物件,物件的變數(shù)稱為myName , 而指派給
變數(shù)myName作為初始化的字串,是HHH字串.
2. 不使用new 關(guān)鍵字建立String物件
String可以允許不使用new關(guān)鍵字建立新物件.
例如 : String myName = "HHH";
H : 那使不使用new有差嗎?答案是有差,下面的記憶體概述會來討論這一部分.
Java 與記憶體概述
電腦的記憶體分為兩區(qū),作為儲存Java程式之用.一是堆疊記憶體(stack)區(qū),另一是堆積記憶體區(qū)(heap).
一般而言,程式中的"區(qū)域變數(shù)"會儲存在stack中, "物件"及"屬性變數(shù)"的"資訊"則會儲存在heap中.
接下來回到String物件的論述,有沒有使用new 關(guān)鍵字,將會影響"儲存資訊"的記憶體位址,
記憶體位址不同,將會影響程式判斷的結(jié)果.
範例1. 請問下面的程式執(zhí)行後,會出現(xiàn)false 或是true ?
public class Test
{
public static void main(String[ ] args)
{
String a = new String("HHH");
String b = new String("HHH");
System.out.println(a==b);
}
}
ANS : 會出現(xiàn)false. 因為
使用new關(guān)鍵字,會在heap記憶體中存取一塊新的位址,所以上面的範例我們?yōu)?/div>
a與b兩個變數(shù)在heap記憶體中建了兩個新的位址, 在Java中有個法則,就是Java在物件的比對上,
比較的是物件資訊的位址,因為上例中a與b的位址不同,所以對Java來說,a與b是兩個不同的變數(shù).
範例2. 請問下面的程式執(zhí)行後,會出現(xiàn)false 或是true ?
public class Test
{
public static void main(String[ ] args)
{
String a = "HHH";
String b = "HHH";
System.out.println(a==b);
}
}
ANS : 會出現(xiàn) true ,因為若沒有使用new關(guān)鍵字建立的物件,其儲存資訊會被納入heap記憶體的字串
儲存池. 因此, 因為a 與 b 兩個變數(shù)沒有使用new關(guān)鍵字,所以儲存資訊HHH會被納入heap記憶
體的字串儲存池, 還記得上面提到的Java法則嗎? Java在物件的比對上,比較的是物件資訊的位址,
既然a與b的物件資訊其位址都是字串儲存池,那麼Java便會將a與b變數(shù)視為相同的物件.
H : 那如果有人問,我就是要比對物件資訊本身的內(nèi)容,
變數(shù)a既然被指派了HHH字串給它,b也被指派了
字串HHH給它,有沒有辦法強迫Java 去比對HHH這個字串本身的內(nèi)容就好呢?
答案是有的,可以使用 .equals() 來解決.範例如下:
範例3. 請問下面的程式如何讓判斷結(jié)果為true ?
public class Test
{
public static void main(String[ ] args)
{
String a =new String("HHH");
String b = "HHH";
System.out.println();
}
}
ANS : 填入 .equals , 變成 a.equals(b),所以正確的程式如下:
public class Test
{
public static void main(String[ ] args)
{
String a =new String("HHH");
String b = "HHH";
System.out.println(a.equals(b));
}
引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=341278
All rights reserved. 版權(quán)所有,保留一切權(quán)利