0

//这是一个研究集合如何工作的小代码,但是当我在 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 对象时,它给出了一个错误“非静态不能从静态方法引用”

4

6 回答 6

3

制作Mountainstatic,如下所示:

static class Mountain {
   ...

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

如需进一步讨论,请参阅:

于 2012-11-22T07:48:07.147 回答
3

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

static class Mountain { ...
于 2012-11-22T07:48:20.107 回答
1

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

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

对于您的程序,您不能这样做,因为 Mountain 类是非静态的,您不能从静态方法访问非静态成员。

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

于 2012-11-22T07:48:23.793 回答
1

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

于 2012-11-22T07:48:33.507 回答
1

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

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

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

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

于 2012-11-22T07:49:11.103 回答
1

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

public static void main(String args[]){

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

或者,您可以将 Mountain 类设为静态,如下所示:

static class Mountain {
   ...
于 2012-11-22T07:51:59.307 回答