Java第三次課程實驗動手動腦&課堂測試
public class Test {
public static void main(String[] args)
{
Foo obj1=new Foo();
Foo obj2=new Foo();
System.out.println(obj1==obj2);
}
}
class Foo
{
int value=100;
}
該測試程式的執行結果是false。
原因為當“==”施加於原始資料型別變數時,是比較變數所儲存的資料是否相等 當“==”施加於引用型別變數時,是比較這兩個變數是否引用同一物件。 引用代表地址,所以“==”實際上相當於比較兩個引用型別變數中儲存的物件地址是否相同。
public class ObjectEquals {
public static void main(String[] args)
{
MyTestClass obj1 = new MyTestClass(100);
MyTestClass obj2 = new MyTestClass(100);
System.out.println(obj1==obj2);
System.out.println(obj1.equals(obj2));
}
}
class MyTestClass
{
public int Value;
public boolean equals(Object obj){
return((MyTestClass) obj).Value==this.Value;
}
public MyTestClass(int intValue)
{
Value=intValue;
}
}
該測試程式的執行結果是false true。
該程式中的方法稱為類的“構造方法”,有時也習慣稱為“建構函式” 當建立一個物件時,它的構造方法會被自動呼叫。構造方法與類名相同,沒有返回值。 如果類沒有定義建構函式,Java編譯器在編譯時會自動給它提供一個沒有引數的“預設構造方法”。
public class Test {
public static void main(String[] args)
{
Foo obj1=new Foo();
}
}
class Foo
{
int value;
public Foo(int intValue)
{
Value=intValue;
}
}
該程式執行時會出錯,原因是 如果類提供了一個自定義的構造方法,將導致系統不再提供預設構造方法。
public class InitializeBlockClass {
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value)
{
this.field=value;
}
public InitializeBlockClass() {
}
public static void main(String[] args)
{
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);
obj=new InitializeBlockClass(300);
System.out.println(obj.field);
}
}
執行結果為100 300。
Java進行初始化的地方有兩個:初始化塊和建構函式,其中初始化塊又分為靜態初始化塊和例項初始化塊。靜態初始化塊是類中由static修飾的初始化塊,例項初始化塊為類中沒有任何關鍵字修飾的初始化語句。
如果在主函式中建立物件時沒有形參時,如果在類中定義了公共的變數並給與了賦值,那麼就會把值賦給主函式中的變數,再呼叫類中的預設建構函式,如果在主函式中建立物件時有形參,則呼叫類中對應的建構函式。
執行TestStaticInitializeBlock.java示例,其輸出結果如下:
總結如下:
- 靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;
- 非靜態初始化塊和建構函式後執行,並且在每次生成物件時執行一次;
- 非靜態初始化塊的程式碼會在類建構函式之前執行。因此若要使用,應當養成把初始化塊寫在建構函式之前的習慣,便於除錯;
- 靜態初始化塊既可以用於初始化靜態成員變數,也可以執行初始化程式碼;
- 非靜態初始化塊可以針對多個過載建構函式進行程式碼複用。
靜態方法中只允許訪問靜態資料,那麼,如何在靜態方法中訪問類的例項成員(即沒有附加static關鍵字的欄位或方法)?
public class ButtonFactory
{
private static ButtonFactory _instance = null;
public static ButtonFactory getInstance()
{
if(null == _instance)
_instance = new ButtonFactory();
return _instance;
}
}
Integer的“詭異”特性”
public class StrangeIntegerBehavior
{
public static void main(String[] args)
{
Integer i1=100;
Integer j1=100;
System.out.println(i1==j1);
Integer i2=129;
Integer j2=129;
System.out.println(i2==j2);
}
}
使用javap來分析生成class檔案,看它呼叫了Interger類的哪個方法,然後開啟JDK原始檔檢視原始碼,就可以找到答案。