1. 程式人生 > >02-類和物件-動手動腦

02-類和物件-動手動腦

1.以下程式碼為何無法通過編譯?哪出錯了?

 1 public class Test {
 2     public static void main(String[] args) {
 3         Foo obji=new Foo();
 4     }
 5 }
 6 class Foo{
 7     int value;
 8     public Foo(int initValue) {
 9         value=initValue;
10     }
11 }

出錯原因:在Foo的這個類中只定義了一個Foo(int)型別的建構函式,在之前的學習工程中,我們並沒有接觸到java的建構函式的宣告過程,因此,在類中沒有書寫建構函式的方法的時候,編譯器預設繼承Object類,並在編譯的時候會產生一個引數為空的建構函式,然而在定義的Foo這個類的時候,給予了一個Foo(int)型別的構造方法,所以在上述Test的呼叫過程中,obj1並不能夠呼叫到new Foo()這個建構函式的方法。

2.請根據程式碼的輸出結果,自行總結JAVA欄位初始化的規律。

規律如下:

所有類的變數都預設初始化為null

數字類的原始資料型別預設初始化為0

執行類成員定義時指定的預設值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。

執行類的構造引數

類的初始化塊不接收任何的引數,而且只要一建立類的物件,它們就會被執行。因此,適合於封裝那些“物件建立時必須執行的程式碼”

3.靜態方法中只允許訪問靜態資料,那麼,如何在靜態方法中訪問類的例項成員(即沒有附加static關鍵字的欄位或方法)?

 1 public class Test{
 2     int x=7;
 3     static
int y=8; 4 public static void test1(){ 5 System.out.println("非靜態變數x為:"+new Test().x); 6 System.out.println("靜態變數y為:"+y); 7 } 8 public static void main(String[] args) { 9 Test.test1(); 10 Test i=new Test(); 11 System.out.println("x="+ i.x); 12
} 13 }

執行結果如下:

非靜態變數x為:7
靜態變數y為:8
x=7