不允许在main方法中声明

时间:2012-11-22 07:45:24

标签: java

//这是一个研究集合如何工作的小代码,但是当我在main方法中创建一个Mountain对象时,它会出错。最后进一步解释。

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);            
    }

    }

以上编译时没有错误行工作正常但是当我想在main方法中创建Mountain的对象时,它会给出错误“非静态无法从静态方法引用”

6 个答案:

答案 0 :(得分:3)

制作Mountainstatic,如下所示:

static class Mountain {
   ...

如果不这样做,Mountain的每个实例都必须有一个与sortMountains关联的实例。由于main()中没有此类实例(方法本身为static),编译器将不允许您在那里实例化Mountain

有关进一步的讨论,请参阅:

答案 1 :(得分:3)

内部类就像一个类的任何其他成员一样。因此,您无法在main()方法中引用非静态内部类,就像您无法在{{1}中引用非静态全局变量一样} 方法。因此,您可以将您的类声明为main()以避免该错误:

static

答案 2 :(得分:1)

Mountain类是内部类,因此创建山对象为:

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

对于您的程序,您无法执行此操作,因为Mountain类是非静态的,您无法从静态方法访问非静态成员。

因此,您可以将Mountain类声明为static,并将其对象创建为Mountain a = new Mountain("Everest",12121);

答案 3 :(得分:1)

如您所见,Mountain类没有封闭的类sortMountains就无法创建它。如果你想以你想要的方式创建sortMountains,你应该在Mountain内声明{。}}。

答案 4 :(得分:1)

您已在sortMountains类中声明了Mountain类。在这种情况下,您可以访问您的内部类

  1. 如果您的内部类是静态的(static class Mountain{})或

  2. 创建外部instance.new innerClass()。

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

答案 5 :(得分:1)

因为你的内部类不是静态的,所以你必须以下面的方式创建该类的对象。

public static void main(String args[]){

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

或者您可以使您的Mountain类保持静态,如下所示:

static class Mountain {
   ...