这是一段代码作为一个例子,其余的只是方法(看迷宫类的底部).所以当这个实例化时,使用
Maze labyrinth = new Maze();
Run Code Online (Sandbox Code Playgroud)
和
System.out.println (labyrinth);
Run Code Online (Sandbox Code Playgroud)
这将打印出网格数组.这是合法的吗?我认为所有类都需要构造函数如何打印出二维网格数组?
迷宫课程:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
mel*_*okb 55
不需要显式定义构造函数; 但是,所有类都必须有一个构造函数,如果你不提供任何构造函数,将生成一个默认的空构造函数:
public Maze() {
}
Run Code Online (Sandbox Code Playgroud)
请参见默认构造函数.
Per*_*ror 13
如果没有显式编写构造函数,编译器默认会生成一个no-args构造函数.
public Maze(){
}
Run Code Online (Sandbox Code Playgroud)
将包括上面的内容如果您没有显式编写构造函数,编译器将默认生成一个no-args构造函数.
public Maze(){
}
Run Code Online (Sandbox Code Playgroud)
以上内容将包含在编译器中.
例如,检查此类的字节代码:
public class ABC {
}
Run Code Online (Sandbox Code Playgroud)
字节代码:
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
}
Run Code Online (Sandbox Code Playgroud)
为了更准确,编译器自动为没有构造函数的类提供no-args构造函数,如果超类没有no-args构造函数,则此构造函数调用超类的no-args构造函数,这是一个错误,如果确实如此,那很好.
如果你的类没有明确的超类,那么它有一个隐含的 超(Object
),它确实有一个无参数的构造函数.
这个问题的典型答案是“如果不声明构造函数,则会创建默认构造函数”。这通常是正确的,但并非总是如此。一个类可能没有构造函数。
(这里要说明的一个重要区别是 JVM不要求所有类文件都具有构造函数;但是,如果未显式声明构造函数,则在Java 中定义的任何类都有一个默认构造函数。这个答案提出了一个奇怪的地方前者的示例是从 Java 代码创建的)。
从这个问题考虑以下代码:
public class Outer
{
private class Inner {}
void someMethod()
{
Inner inObj = this.new Inner();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你用 OpenJDK 编译它,你会发现 3 个类文件:
Outer.class
Outer$Inner.class
Outer$1.class
Run Code Online (Sandbox Code Playgroud)
Outer$1
其中最不寻常的是:它实际上什么都没有,甚至没有构造函数:
Compiled from "Outer.java"
class Outer$1 {
}
Run Code Online (Sandbox Code Playgroud)
而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
}
Run Code Online (Sandbox Code Playgroud)