02-類和物件-動手動腦
阿新 • • 發佈:2018-11-07
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 staticint 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