2012-11-22 131 views
0

//這是一個小的代碼,研究如何收集的作品,但是當我創建的主要方法的山對象時,它給出了一個錯誤。最後進一步解釋。不是允許在main方法聲明

import java. util. * ; 
    public class sortMountains { 
    class Mountain { 
       String name; 
       int height; 
       Mountain(String n, int h) { 
       name  = n; 

       height = h; 
       } 
       public String toString() { 
       return name + + height; 
       } 
      } 
    List<Mountain> mtn = new ArrayList<Mountain>(); 
     class NameCompare implements Comparator <Mountain> { 
     public int compare(Mountain one, Mountain two) { 
      return one.name. compareTo(two. name); 
     } 
     } 
     class HeightCompare implements Comparator <Mountain> { 
     public int compare(Mountain one, Mountain two) { 
    return (two. height - one. height) ; 
    } 

     } 
     public void go() { 
      mtn.add(new Mountain("Longs ", 14255)); 
      mtn.add(new Mountain("Elbert ", 14433)); 
      mtn.add(new Mountain("Maroon " , 14156)); 
      mtn.add(new Mountain("Castle ", 14265)); 

      System.out.println("as entered:\n" + mtn); 
      NameCompare nc = new NameCompare(); 
      Collections.sort(mtn, nc); 
      System.out.println("by name:\n'" + mtn); 
      HeightCompare hc = new HeightCompare(); 
      Collections.sort(mtn, hc); 
      System.out.println("by height:\n " + mtn); 
      } 
    public static void main(String args[]){ 

     sortMountains sorting=new sortMountains(); 
     sorting.go(); 
     //error line Mountain a=new Mountain("Everest",12121);    
    } 

    } 

以上時沒有錯誤線工作正常,但當我想創建山的對象主要方法它提供了一個錯誤「非靜態的不能從靜態方法中引用」

+1

** ** 1搜索(HTTP [非靜態的不能從靜態方法中引用] .com/search?q =非靜態+不能+ be + reference + from + static + method&submit = search)** 2。**閱讀一些帖子/答案** 3。**避免-1's – 2012-11-22 07:51:40

+0

http:// stackoverflow.com/questions/290884/what-is-the-reason-behind-non-static-method-cannot-be-referenced-from-a-static(百萬分之一,無論如何都有很多upvotes) – 2012-11-22 07:53:58

回答

3

編譯製作的

static class Mountain { 
    ... 

如果你不這樣做,的Mountain每個實例都必須有與之相關聯的sortMountains一個實例:Mountainstatic,像這樣。由於有在main()沒有這樣的實例(該方法本身是static),編譯器不會讓你實例Mountain那裏。

如需進一步討論,請參見:

3

內部類就像一個類的任何其他成員。所以你不能在main()方法中參考非靜態內部類,它就像你不能參考非靜態全局變量在main()方法中一樣。所以,你可以聲明類爲static,以避免錯誤:

static class Mountain { ... 
1

山類是內部類,所以創建山對象爲:

sortMountains sorting=new sortMountains(); 
Mountain a = sorting.new Mountain("Everest",12121); 

爲了您的程序,你不能這樣做,因爲山班是非靜態的,你不能從靜態方法訪問非靜態成員。

所以,你可以聲明山類靜態和創建它的對象爲Mountain a = new Mountain("Everest",12121);

1

正如你所看到的,Mountain類也離不開它包圍類sortMountains創建。如果你想在你所希望的方式去創造你應該申報sortMountains靜態內部Mountain

1

您已經聲明中sortMountains類的山類。在這種情況下,如果你的內部類是靜態的(static class Mountain{})或

  • 創建外instance.new內部類(),您可以訪問內部類

    1. Mountain a=sorting.new Mountain("Everest",12121);

  • 1

    因爲這樣你在下面的方式來創建該類的對象的內部類也不是一成不變的。

    public static void main(String args[]){ 
    
        sortMountains sorting=new sortMountains(); 
        sorting.go();  
        Mountain a = sorting.new Mountain("Everest", 12121); 
    } 
    

    或者你可以讓你的山類的靜態,如下列://計算器:

    static class Mountain { 
        ...