1. 程式人生 > >Java第三次課程實驗動手動腦&課堂測試

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示例,其輸出結果如下:

總結如下:

  1. 靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;
  2. 非靜態初始化塊和建構函式後執行,並且在每次生成物件時執行一次;
  3. 非靜態始化塊的程式碼會在類建構函式之前執行。因此若要使用,應當養成把初始化塊寫在建構函式之前的習慣,便於除錯;
  4. 靜態初始化塊既可以用於初始化靜態成員變數,也可以執行初始化程式碼
  5. 非靜態初始化塊可以針對多個過載建構函式進行程式碼複用

 

靜態方法中只允許訪問靜態資料,那麼,如何在靜態方法中訪問類的例項成員(即沒有附加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原始檔檢視原始碼,就可以找到答案。