java03類與物件相關問題
阿新 • • 發佈:2018-10-31
1.使用類的靜態欄位和建構函式,可以跟蹤某個類所建立物件的個數。請寫一個類,在任何時候都可以向他查詢“你已經建立了幾個物件”
1 package 第四五週; 2 3 public class Duixiangshu { 4 private static int n; 5 6 public Duixiangshu() 7 { 8 n++; 9 }//建構函式 10 11 public static int value() 12 { 13 return n;14 } 15 16 public static void main(String[] args) { 17 // TODO 自動生成的方法存根 18 Duixiangshu a1=new Duixiangshu(); 19 Duixiangshu a2=new Duixiangshu(); 20 Duixiangshu a3=new Duixiangshu(); 21 Duixiangshu a4=new Duixiangshu(); 22 Duixiangshu a5=new Duixiangshu(); 23 System.out.println("已建立物件個數為 :"+Duixiangshu.value());24 } 25 26 }
執行結果:
2. 靜態方法中只允許訪問靜態資料,那麼,如何在靜態方法中訪問類的例項成員,請編寫程式碼驗證你的猜想。
1 package 第四五週; 2 3 public class Shilibianliang { 4 int x=3; 5 static int y=4; 6 public static void main(String[] args) { 7 // TODO 自動生成的方法存根 8 Shilibianliang sl=new Shilibianliang();9 System.out.println("例項成員"+sl.x); 10 System.out.println("靜態成員"+y); 11 } 12 13 }
執行截圖:
3.以下程式碼為何通不過編譯
解答:
因為Foo類中自行定義了建構函式,而且是有引數的建構函式,但在主函式建立物件的卻沒有引數,導致無法建立物件,無法對其進行初始化,所以
沒有通過編譯。若自行定義建構函式,則創造物件時引數必須匹配。
4.請執行下列示例,觀察輸出結果,總結出“靜態初始化塊的執行順序”。
1 package 第四五週; 2 3 class Root 4 { 5 static{ 6 System.out.println("Root的靜態初始化塊"); 7 } 8 { 9 System.out.println("Root的普通初始化塊"); 10 } 11 public Root() 12 { 13 System.out.println("Root的無引數的構造器"); 14 } 15 } 16 class Mid extends Root 17 { 18 static{ 19 System.out.println("Mid的靜態初始化塊"); 20 } 21 { 22 System.out.println("Mid的普通初始化塊"); 23 } 24 public Mid() 25 { 26 System.out.println("Mid的無引數的構造器"); 27 } 28 public Mid(String msg) 29 { 30 //通過this呼叫同一類中過載的構造器 31 this(); 32 System.out.println("Mid的帶引數構造器,其引數值:" + msg); 33 } 34 } 35 class Leaf extends Mid 36 { 37 static{ 38 System.out.println("Leaf的靜態初始化塊"); 39 } 40 { 41 System.out.println("Leaf的普通初始化塊"); 42 } 43 public Leaf() 44 { 45 //通過super呼叫父類中有一個字串引數的構造器 46 super("Java初始化順序演示"); 47 System.out.println("執行Leaf的構造器"); 48 } 49 50 } 51 52 public class Chushihua { 53 54 public static void main(String[] args) { 55 // TODO 自動生成的方法存根 56 new Leaf(); 57 } 58 59 }
執行截圖:
總結:
先執行靜態初始化塊,再依次執行每個類的普通塊和構造器。
5.請依據程式碼執行結果,自行總結Java欄位初始化的規律。
1 package 第四五週; 2 3 class InitializeBlockClass 4 { 5 { 6 filed =200; 7 }//初始化塊 8 public int filed =100; 9 public InitializeBlockClass(int value) 10 { 11 this.filed=value; 12 }//帶引數的建構函式 13 public InitializeBlockClass() 14 { 15 16 }//不帶函式的建構函式 17 } 18 public class Chushihuakuai { 19 20 public static void main(String[] args) { 21 // TODO 自動生成的方法存根 22 InitializeBlockClass a=new InitializeBlockClass(); 23 System.out.println("filed = :"+a.filed); 24 InitializeBlockClass b=new InitializeBlockClass(300); 25 System.out.println("filed = :"+b.filed); 26 } 27 28 }
執行截圖:
總結:
若構造有引數的物件,則呼叫有引數的建構函式,成員數值由建構函式中的函式體決定。如果呼叫沒有引數的建構函式,成員數值由初始化塊外的語句決定,
如果初始化塊外沒有賦值語句,則以初始化塊決定。