1

私のコード:

(スタック オーバーフロー エラーが発生します)

public class Overloads {
    String uniqueID;    
    Overloads ov2=new Overloads();

    public static void main(String[] args) {
        System.out.println("IN MAIN");
    }

    public void setUniqueID(String theID) {
        // II lots of validation code, and then:
        uniqueID = theID;
        System.out.println(uniqueID);
    }
}

このコードは正常に動作します:

public class Overloads {
    String uniqueID;   

    public static void main(String[] args) {
          Overloads ov2=new Overloads();
          System.out.println("IN MAIN");
    }

    public void setUniqueID(String theID) {
        // II lots of validation code, and then:
        uniqueID = theID;
        System.out.println(uniqueID);           
    }
}
4

2 に答える 2

12

ここでは main メソッドの存在は関係ありません。ただし、変数を宣言したスコープは非常に重要です。

コードの最初のバージョンで何が起こるかを確認しましたか?

Create new instance of Overloads
  -> ov2 = Create new instance of Overloads
      -> ov2 = Create new instance of Overloads
         -> ov2 = Create new instance of Overloads

等々。変数ov2はクラスのスコープ内にあるため、クラスのインスタンスがインスタンス化されるたびに初期化されます。これは、メモリが不足してスタック オーバーフローが発生するまで終了しません。より明確に表示するには、デバッガーで実行します。

Overloadsコードの 2 番目のバージョンは、main メソッドのスコープ内で のインスタンスを 1 つだけインスタンス化します。したがって、1 つのインスタンスを作成しても、新しく作成されたインスタンスが新しいインスタンスを作成することにはなりません。

于 2013-10-07T07:30:44.230 に答える
1

あなたはこのようにすることができます

public class Overloads {
    String uniqueID;
    static Overloads ov2 = new Overloads();

    public static void main(String[] args) {
        System.out.println("IN MAIN");
    }

    public void setUniqueID(String theID) {
        // II lots of validation code, and then:
        uniqueID = theID;
        System.out.println(uniqueID);
    }
}

これにより、オーバーロードの共有インスタンスが作成されます。インスタンス化は、クラスがロードされたときに 1 回だけ行われます。

于 2013-10-07T07:54:57.747 に答える