2012-11-22 78 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 { 
        ...