57

これは例としてのコードの一部です。この残りの部分は単なるメソッドです(迷路クラスについては下部を参照してください)。したがって、これがインスタンス化されると、

Maze labyrinth = new Maze();

System.out.println (labyrinth);

これにより、グリッド配列が出力されます。これは合法ですか?すべてのクラスにコンストラクターが必要だと思いましたが、2次元グリッド配列をどのように出力しますか?

迷路クラス:

public class Maze
{
    private final int TRIED = 3;
    private final int PATH = 7;
    private int[][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1},
                             {1,0,1,1,1,0,1,1,1,1,0,0,1},
                             {0,0,0,0,1,0,1,0,1,0,1,0,0},
                             {1,1,1,0,1,1,1,0,1,0,1,1,1},
                             {1,0,1,0,0,0,0,1,1,1,0,0,1},
                             {1,0,1,1,1,1,1,1,0,1,1,1,1},
                             {1,0,0,0,0,0,0,0,0,0,0,0,0},
                             {1,1,1,1,1,1,1,1,1,1,1,1,1} };

    public String toString ()
    {
        String result = "\n";
        for (int row = 0; row < grid.length; row++)
        {
            for (int column=0; column < grid[row].length; column++)
            result += grid[row][column] + "";
            result += "\n";
        }
        return result;
    }

}
4

7 に答える 7

68

コンストラクターを明示的に定義する必要はありません。ただし、すべてのクラスにはコンストラクターが必要であり、何も指定しない場合はデフォルトの空のコンストラクターが生成されます。

public Maze() {
}

デフォルトコンストラクタを参照してください。

于 2012-12-08T02:06:43.587 に答える
15

コンストラクターを明示的に記述しない場合、コンパイラーはデフォルトで引数なしのコンストラクターを生成します。

public Maze(){

}    

上記が含まれますコンストラクターを明示的に記述しない場合、コンパイラーはデフォルトで引数なしのコンストラクターを生成します。

public Maze(){

}    

上記はコンパイラに含まれます。

たとえば、このクラスのバイトコードを確認します。

public class ABC {

}

バイトコード:

public class sorting/ABC {

  // compiled from: ABC.java

  // access flags 0x1
  public <init>()V         //Default no-args constructor included by the compiler
   L0
    LINENUMBER 7 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init>()V
    RETURN
   L1
    LOCALVARIABLE this Lsorting/ABC; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}
于 2012-12-08T02:06:57.673 に答える
9

より正確に言うと、コンパイラーは、コンストラクターを持たないクラスに引数なしのコンストラクターを自動的に提供します。スーパークラスに引数なしのコンストラクターがない場合、このコンストラクタースーパークラスの引数なしのコンストラクターを呼び出します。エラーですが、エラーが発生した場合は問題ありません。

クラスに明示的なスーパークラスがない場合は、暗黙の スーパークラスObject)があり、これには引数なしのコンストラクターがあります。

于 2015-04-26T11:58:32.633 に答える
7

この質問に対する一般的な答えは、「コンストラクターを宣言しない場合、デフォルトのコンストラクターが作成される」です。これは通常は真実ですが、常にそうであるとは限りませ。クラスにコンストラクターがない可能性があります。

(ここで重要な違いは、JVMですべてのクラスファイルにコンストラクターが必要なわけではないことです。ただし、コンストラクターが明示的に宣言されていない場合、Java で定義されたクラスにはデフォルトのコンストラクターがあります。この答えは奇妙なことです。前者の例はJavaコードから作成されています)。

この質問から、次のコードを検討してください。

public class Outer
{
    private class Inner {}

    void someMethod()
    {
        Inner inObj = this.new Inner();
    }
}

これをOpenJDKでコンパイルすると、次の3つのクラスファイルが見つかります。

Outer.class
Outer$Inner.class
Outer$1.class

Outer$1これらの中で最も珍しいものです。文字通り何も含まれておらず、コンストラクターさえも含まれていません。

Compiled from "Outer.java"
class Outer$1 {
}

一方、InnerクラスOuterには生成されたコンストラクタがあります。

Compiled from "Outer.java"
class Outer {
  Outer();        <------------- Generated Constructor
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  void someMethod();
    Code:
       0: new           #2                  // class Outer$Inner
       3: dup
       4: aload_0
       5: aconst_null
       6: invokespecial #3                  // Method Outer$Inner."<init>":(LOuter;LOuter$1;)V
       9: astore_1
      10: return
}
Compiled from "Outer.java"
class Outer$Inner {
  final Outer this$0;

  Outer$Inner(Outer, Outer$1);        <------------- Generated Constructor
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #1                  // Method "<init>":(LOuter;)V
       5: return
}
于 2017-12-19T08:59:53.243 に答える
4

コンストラクターを指定しない場合、デフォルトのコンストラクターがコンパイラーによって生成されます。

ただし、宣言時に初期化されないメンバー変数はすべてnullになります。

つまり、グリッドに値を割り当てない場合(例のように)、値はnullになります。

宣言するとすぐにグリッドに値を割り当てるため、この例は正常に機能します。

于 2012-12-08T02:09:55.417 に答える
0

Javaは、実際にはクラス記述に明示的なコンストラクターを必要としません。コンストラクターを含めない場合、Javaコンパイラーは空の引数を持つデフォルトのコンストラクターを作成します。

于 2017-05-03T08:28:06.157 に答える
-1

クラスのインスタンスを直接作成したくない場合は、コンストラクターにアクセス修飾子をプライベートに設定させ、このプライベートにアクセスできるパブリック静的メソッドによってのみこのクラスのインスタンスを作成できると思います。コンストラクタ

于 2020-02-12T10:49:15.463 に答える