1.main()方法
在java中,main()方法是java應用程序的入口方法,也就是說,程序在運行的時候,第一個執行的方法就是main()方法,這個方法和其他的方法有很大的不同,比如方法的名字必須是main,方法必須是public static void類型的,方法必須是接受一個字符串數組的參數等。
因爲main()方法是由Java虛擬機調用的,所以必須是public,虛擬機調用的main()方法的時候,不需要產生任何對象,所以main()方法聲明爲static,且不需要返回值,所以必須聲明爲void,最終格式如下所示: public void main(String[] args)
在學習java中的main()方法之前,先看下面一段程序:
1 public class Demo 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("打印main方法的輸入參數"); 6 for(int i=0;i<args.length;i++){ 7 System.out.println(args[i]); 8 } 9 } 10 }
現在對上面的程序做一個簡單的解釋,Demo類中有main()方法,說明這是個Java應用程序,通過JVM直接啓動運行的程序。main()方法中有一個輸入參數,類型爲String[],這個也是java中的規範,至於字符串的名字,這個可以自己設定,根據習慣,這個字符串數組的名字一般和Sun Java規範範例中的main()的參數名保持一致,取名爲args。而且main()方法不準拋出異常,因此main()方法中的異常要麼不處理,要麼不處理,不能繼續拋出。
main()方法中的字符串參數數組的作用是結婚搜命令行輸入參數,命令行的參數之間用空格隔開。下面爲上述程序段運行結果:
2.java中靜態成員
通常情況下,方法必須通過它的類對象訪問。但是如果該方法的使用完全對立於該類的任何對象,可以利用static關鍵字。通過該關鍵字可以創建一個方法或者變量,它能夠被自己使用,而不用引用特定的示例。在方法或變量前面加上static即可。
如果一個方法被聲明爲static,它就能夠在它的類任何對象創建之前被訪問,而不必引用任何對象。下面示例中,演示靜態方法和靜態變量的使用。
1 public class StaticDemo1 2 { 3 //s爲靜態變量 4 public static String s="我是靜態變量"; 5 //靜態方法 6 public static void printInfo(){ 7 System.out.println("我是靜態方法"); 8 } 9 public static void main(String[] args){ 10 //調用StaticDemo1中的printInfo方法時,不需要創建新的 11 //StaticDemo1對象,直接訪問即可 12 StaticDemo1.printInfo(); 13 //直接調用StaticDemo1中的s變量時,直接訪問即可 14 System.out.println(StaticDemo1.s); 15 } 16 }
運行結果:
在Java中沒有一個直接的修飾符來實現常量,而是通過靜態成員變量的方式來實現的,如: public static final int X=20; static public final int Y=30; static表示屬於類,不必創建對象可以使用,因爲常量應該不依賴任何對象,final表示值不能改變。一般用作常量的靜態成員變量訪問權限設置爲public,因爲常量應該允許所有的類或對象訪問。
對於非靜態成員變量,系統不會爲其分配默認值,必須在構造器完成之前對其初始化。對於靜態成員變量,系統也不會爲其分配默認值,也要求開發人員必須對其進行初始化。但是靜態變量屬於類,是不能等到構造器運行在初始化的,因爲類加載完成之後其值必須可以使用。在Java中,靜態成員變量的的初始化要求在靜態語句塊結束之前必須完成。即Java中靜態成員變量的初始化時機有兩個,在聲明的同時進行初始化或者在靜態語句塊中進行初始化。
1 //功能:初始化靜態成員變量介紹 2 public class StaticDemo2 3 { 4 //聲明並初始化常量const1 5 public static final int const1=1111; 6 //聲明常量const2 7 public static final int const2; 8 /********************************** 9 下面爲靜態語句塊,是靜態成員的一種。在此靜態語句中初始化了常量 10 const2.靜態語句塊在類加載時執行一次,可以將對類進行初始化的代碼寫在其中。 11 ***********************************/ 12 static { 13 //初始化常量const2 14 const2=2222; 15 } 16 public static void main(String [] args){ 17 System.out.println("兩個常量的值分別爲const1="+const1+",const2="+const2); 18 } 19 }
如果將第11到15行註釋掉,在次進行編譯,就會報“可能尚未初始化變量const2”錯誤。
對於靜態成員的訪問,可以直接使用"<類名>.<靜態成員名>"的語法調用靜態成員變量。
a.靜態方法訪問非靜態成員
1 public class StaticDemo3 2 { 3 int var=13; 4 public static void main(String[] args){ 5 System.out.println("成員變量var的值爲:"+var); 6 } 7 }
編譯代碼,運行結果:
從上圖可以看出,編譯報“無法從靜態上下文中引用非靜態變量 var”錯,這是因爲main()方法自身便是一個靜態方法,而var是非靜態成員。因爲靜態成員不依賴於該類的任何對象,所以當其所在的類加載成功後,就可以被訪問了,此時對象並不一定存在,非靜態成員自然也不一定存在,靜態成員的生命週期比非靜態成員的長。即使訪問時存在非靜態成員,靜態方法也不一定知道訪問的是哪一個對象的成員,因爲靜態方法屬於類,非靜態成員屬於對象,所以靜態方法將不知道關於其所屬類對象的消息。而靜態方法訪問靜態成員時,自然是任何時候都沒有問題,靜態成員都屬於類,只要類存在,靜態成員都存在。同樣的道理,在靜態方法中是不能使用this預定義對象引用的,即使其後邊所操作的也是靜態成員也不行。因爲this代表指向自己對象的引用,而靜態方法是屬於類的,不屬於對象,其成功加載後,對象還不一定存在,也不知道this指的是哪一個對象。
1 public class StaticDemo4 2 { 3 static int x=100; 4 public static void main(String[] args){ 5 int y=this.x; 6 } 7 }
編譯後,運行結果:
b.非靜態方法訪問靜態成員
非靜態方法訪問靜態成員的時候,規則比較簡單。非靜態成員的生命週期被靜態成員生命週期包含,因此當非靜態成員存在的時候,靜態成員絕對存在。故非靜態方法在任何時候都可以訪問靜態成員。