類與物件 動手動腦
阿新 • • 發佈:2018-11-07
使用類的靜態欄位與建構函式,可以跟蹤某個類所建立物件的個數。請寫一個類,在任何時候都可以向它查詢“你已經建立了多少個物件?”
public class Track { static private int count=0; Track(){ count++; } public static void inquries(){ System.out.println("現已建立物件"+count+"個"); } }Track
以下程式碼為何無法通過編譯?哪兒出錯了?
public class Test { public static void main( String[] args ){ Foo obj1= new Foo(); } } class Foo{ int value; public Foo( int initValue){ value = initValue; } }Test
如果類提供了一個自定義的構造方法,系統將不再提供預設構造方法
使用上頁幻燈片中定義的類,以下程式碼的輸出結果是什麼?
public class InitializeBlockClass { { field = 200; } public int field=100; public InitializeBlockClass( int value ){ this.field=value; } public InitializeBlockClass(){ } }InitializeBlockClass
public static void main( String[] args){ InitializeBlockClass objmain= new InitializeBlockClass(); System.out.println(obj.field);//? obj = new InitializeBlockClass(300); System.out.println(obj.field);//? }
請根據程式碼的輸出結果,自行總結Java欄位初始化的規律
執行截圖:
執行類成員定義時指定的預設值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。
請執行TestStaticInitializeBlock.java示例,觀察輸出結果,總結出“靜態初始化塊的執行順序”。
class Root { static{ System.out.println("Root的靜態初始化塊"); } { System.out.println("Root的普通初始化塊"); } public Root() { System.out.println("Root的無引數的構造器"); } } class Mid extends Root { static{ System.out.println("Mid的靜態初始化塊"); } { System.out.println("Mid的普通初始化塊"); } public Mid() { System.out.println("Mid的無引數的構造器"); } public Mid(String msg) { //通過this呼叫同一類中過載的構造器 this(); System.out.println("Mid的帶引數構造器,其引數值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的靜態初始化塊"); } { System.out.println("Leaf的普通初始化塊"); } public Leaf() { //通過super呼叫父類中有一個字串引數的構造器 super("Java初始化順序演示"); System.out.println("執行Leaf的構造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }TestStaticInitializeBlock.java
執行截圖:
先執行父類的靜態初始化塊,再執行該類的初始化塊
靜態方法中只允許訪問靜態資料,那麼,如何在靜態方法中訪問類的例項成員(即沒有附加static關鍵字的欄位或方法)?
請編寫程式碼驗證你的想法。
public class SteadyState { private int value; public static void method( SteadyState a){ SteadyState b = new SteadyState(100); b=a; System.out.println("b.value="+b.value); } SteadyState(int value){ this.value = value; } public static void main( String[] args){ SteadyState a = new SteadyState(500); SteadyState.method(a); } }SteadyState.java
執行截圖:
先例項化類,得到一個例項變數,將要使用的類作為引數傳給靜態方法