第三講類與對象
【動手動腦】
錯誤分析:
如果類提供了一個自定義的構造方法,將導致系統不再提供默認構造方法。
源程序中並沒有Foo()此構造函數,所以無法實現,所以需要再寫一個構造函數。
【自找麻煩】
總結
首先,在main函數中先調用不同的構造函數。對於初始化板塊,源程序運行會自行覆蓋,所以把int field與初始化板塊交換順序,最後輸出就是200。
執行類成員定義時指定的默認值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。
類的初始化塊不接收任何的參數,而且只要一創建類的對象,它們就會被執行。因此,適合於封裝那些“對象創建時必須執行的代碼”。
【動手動腦】
總結:
靜態初始化塊只執行一次。因為靜態初始化板塊只會在第一次裝入系統的時候運行,當再次實例化的時候就不需要再執行了,因為已經存在了。
創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。
【一個有趣的問題】
驗證:
//信1605-2班 那穎 20163448
public class Verify
{
private int x=9;
public static void display()
{
Verify v=new Verify();
System.out.println(v.x);
}
public static void main(String[] args)
{
display();
}
public void get(int n)
{
x=n;
}
}
【課後作業1】
源程序:
//信1605-2 那穎 20163448
import java.util.Scanner;
class Number
{
static int number=0;
static void display()
{
++number;
System.out.println("At present now it has created "+number+" objects.");
}
}
public class ReferCreateObject
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
String character=" ";
do
{
Number a=new Number();
a.display();
System.out.println("是否繼續創建新對象(Y/N)");
character=input.next();
}while(character.equals("Y"));
}
}
【運行結果】
【思考Integer的“詭異”特性】
使用javap反編譯在cmd中可以看到調用了Interger中的valueOf函數,因為Interger的適用範圍是-128到127,而129超過了該範圍。
第三講類與對象