1. 程式人生 > >java03類與物件相關問題

java03類與物件相關問題

  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 }

執行截圖:

總結:

  若構造有引數的物件,則呼叫有引數的建構函式,成員數值由建構函式中的函式體決定。如果呼叫沒有引數的建構函式,成員數值由初始化塊外的語句決定,

如果初始化塊外沒有賦值語句,則以初始化塊決定。