main()方法爲什麼遵循格式:public void main(String[] args);靜態方法爲什麼不能引用this

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.非靜態方法訪問靜態成員

  非靜態方法訪問靜態成員的時候,規則比較簡單。非靜態成員的生命週期被靜態成員生命週期包含,因此當非靜態成員存在的時候,靜態成員絕對存在。故非靜態方法在任何時候都可以訪問靜態成員。

發佈了12 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章