Ответ 1
Не требуется явно определять конструктор; однако все классы должны иметь конструктор, и пустой конструктор по умолчанию будет сгенерирован, если вы его не предоставите:
public Maze() {
}
Это часть кода в качестве примера, после этого остальные просто методы (посмотрите внизу для класса лабиринта). Поэтому, когда это создается, используя
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;
}
}
Не требуется явно определять конструктор; однако все классы должны иметь конструктор, и пустой конструктор по умолчанию будет сгенерирован, если вы его не предоставите:
public Maze() {
}
Если вы не будете писать конструктор явно, компилятор по умолчанию создаст конструктор 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
}
Если вы не укажете конструктор, конструктор по умолчанию будет сгенерирован компилятором.
Однако любая переменная-член, которая не инициализируется при объявлении, будет равна нулю.
Другими словами, если вы не назначаете значение сетке (например, в вашем примере), оно будет равно null.
Ваш пример отлично работает, потому что вам сразу присваивается значение сетке после объявления его.
Чтобы быть более точным, компилятор автоматически предоставляет конструктор no-args для класса, у которого нет конструктора, этот конструктор вызывает конструктор no-args суперкласса, если суперкласс не имеет no- конструктор args, это ошибка, если да, то хорошо.
Если ваш класс не имеет явного суперкласса, то он имеет неявный суперкласс (Object
), который имеет конструктор no-args.
Java фактически не требует явного конструктора в описании класса. Если вы не включаете конструктор, то компилятор Java создаст конструктор по умолчанию с пустым аргументом.
Типичный ответ на этот вопрос: "Если вы не объявляете конструктор, создается конструктор по умолчанию". Это обычно верно, но не всегда. Класс может не иметь конструктора.
(Важное отличие здесь состоит в том, что 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
}