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

    }

エラー行なしでコンパイルされた場合、上記は正常に動作しますが、メイン メソッドで Mountain のオブジェクトを作成したい場合、「静的メソッドから非静的を参照できません」というエラーが発生します。

4

6 に答える 6

3

次のようにMountainクラスを作成します。static

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

内部クラスは静的ではないため、次の方法でそのクラスのオブジェクトを作成する必要があります。

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 に答える
1

Mountain クラスはインナークラスなので、山のオブジェクトを次のように作成します。

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

Mountain クラスは非静的であり、静的メソッドから非静的メンバーにアクセスできないため、プログラムではこれを行うことはできません。

したがって、Mountain クラスを static として宣言し、そのオブジェクトを次のように作成できます。Mountain a = new Mountain("Everest",12121);

于 2012-11-22T07:48:23.793 に答える
1

ご覧のとおり、Mountainclass it はそれを囲む class なしでは作成できませんsortMountains。必要な方法で作成する場合は、sortMountains内部で static を宣言する必要があります。Mountain

于 2012-11-22T07:48:33.507 に答える
1

クラス内で Mountain クラスを宣言しましたsortMountains。その場合、内部クラスにアクセスできます

  1. 内部クラスが静的 ( static class Mountain{}) または

  2. 外側の instance.new innerClass() を作成しています。

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

于 2012-11-22T07:49:11.103 に答える