一个类可以没有构造函数吗?

Aar*_*ron 47 java

这是一段代码作为一个例子,其余的只是方法(看迷宫类的底部).所以当这个实例化时,使用

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)

请参见默认构造函数.

  • `toString()`是否在实际的类中使用自定义打印逻辑覆盖(在其中一种方法中你没有向我们展示)?我只是将你的类复制到一个新的Java项目中,当我打印出来时,我按照预期得到了"Maze @ 50c8d62f".因为默认情况下自定义类没有方法以有意义的方式打印出其内容. (2认同)
  • `System.out.println`只调用新创建的`Maze`对象的`toString()`方法. (2认同)

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)

  • 对我来说太过先进了 (4认同)
  • @亚伦没有什么提前。最好检查您编写的代码的字节码。我建议下载字节码大纲作为eclipse插件。:) (2认同)

Mar*_*oun 7

为了更准确,编译器自动为没有构造函数的类提供no-args构造函数,如果超类没有no-args构造函数,则此构造函数调用类的no-args构造函数,这是一个错误,如果确实如此,那很好.

如果你的类没有明确的超类,那么它有一个隐含的 (Object),它确实有一个无参数的构造函数.


And*_*ner 5

这个问题的典型答案是“如果不声明构造函数,则会创建默认构造函数”。这通常是正确的,但并非总是如此。一个类可能没有构造函数。

(这里要说明的一个重要区别是 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)

InnerOuter类具有生成的构造函数:

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)