Подтвердить что ты не робот

Может ли класс не иметь конструктора?

Это часть кода в качестве примера, после этого остальные просто методы (посмотрите внизу для класса лабиринта). Поэтому, когда это создается, используя

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

}
4b9b3361

Ответ 1

Не требуется явно определять конструктор; однако все классы должны иметь конструктор, и пустой конструктор по умолчанию будет сгенерирован, если вы его не предоставите:

public Maze() {
}

См. Конструктор по умолчанию.

Ответ 2

Если вы не будете писать конструктор явно, компилятор по умолчанию создаст конструктор no-args.

public Maze(){

}    

приведенное выше будет включено. Если вы не будете писать конструктор явно, компилятор по умолчанию создаст конструктор no-args.

public Maze(){

}    

приведенное выше будет включено компилятором.

для примера проверьте код байта для этого класса:

public class ABC {

}

BYTE CODE:

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
}

Ответ 3

Если вы не укажете конструктор, конструктор по умолчанию будет сгенерирован компилятором.

Однако любая переменная-член, которая не инициализируется при объявлении, будет равна нулю.

Другими словами, если вы не назначаете значение сетке (например, в вашем примере), оно будет равно null.

Ваш пример отлично работает, потому что вам сразу присваивается значение сетке после объявления его.

Ответ 4

Чтобы быть более точным, компилятор автоматически предоставляет конструктор no-args для класса, у которого нет конструктора, этот конструктор вызывает конструктор no-args суперкласса, если суперкласс не имеет no- конструктор args, это ошибка, если да, то хорошо.

Если ваш класс не имеет явного суперкласса, то он имеет неявный суперкласс (Object), который имеет конструктор no-args.

Ответ 5

Java фактически не требует явного конструктора в описании класса. Если вы не включаете конструктор, то компилятор Java создаст конструктор по умолчанию с пустым аргументом.

Ответ 6

Типичный ответ на этот вопрос: "Если вы не объявляете конструктор, создается конструктор по умолчанию". Это обычно верно, но не всегда. Класс может не иметь конструктора.

(Важное отличие здесь состоит в том, что 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
}