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

时间:2012-12-08 02:02:56

标签: java

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

Maze labyrinth = new Maze();

System.out.println (labyrinth);

这将打印出网格数组。 这是合法的吗?我认为所有类都需要构造函数如何打印出2-d网格数组?

迷宫课程:

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

}

7 个答案:

答案 0 :(得分:50)

显式定义构造函数不是必需的;但是,所有类都必须有一个构造函数,如果你不提供任何构造函数,将生成一个默认的空构造函数:

public Maze() {
}

请参阅Default Constructor

答案 1 :(得分:13)

如果你没有显式编写构造函数,编译器默认会生成一个no-args构造函数。

public Maze(){

}    

上面将包含如果你没有显式编写构造函数,编译器默认会生成一个no-args构造函数。

public Maze(){

}    

以上内容将由编译器包含。

for example检查此类的字节代码:

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
}

答案 2 :(得分:5)

为了更准确,编译器会自动为没有构造函数的类提供 no-args 构造函数,此构造函数调用 no-args 超类的构造函数,如果超类没有 no-args 构造函数,那么它是一个错误,如果是,那就是&#39很好。

如果您的类没有明确的超类,那么它有隐式 超类Object),其中 有一个 no-args 构造函数。

答案 3 :(得分:4)

如果您没有指定构造函数,编译器将生成默认构造函数。

但是,任何未声明的成员变量在声明时都将为null。

换句话说,如果您没有为 grid 分配值(就像您在示例中所做的那样),它将为null。

您的示例运行正常,因为您在声明它时会立即为 grid 分配一个值。

答案 4 :(得分:2)

这个问题的典型答案是&#34;如果您没有声明构造函数,则会创建默认构造函数&#34;。那是通常是真的,但不是总是。一个类可能没有构造函数。

(这里绘制的一个重要区别是JVM does not require all class files to have a constructor;但是, Java does have a default constructor if a constructor is not explicitly declared中定义的任何类。这个答案呈现出一个奇怪的例子前者是用Java代码创建的。

请考虑以下代码,来自this question

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

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
}

答案 5 :(得分:0)

Java实际上并不需要类描述中的显式构造函数。如果您不包含构造函数,那么Java编译器将创建一个带有空参数的默认构造函数。

答案 6 :(得分:-1)

如果您的意思是不想让任何人直接创建类的实例,我认为您可以创建一个构造函数,将其访问修饰符设置为private,并且只能通过具有访问权限的公共静态方法来创建此类的实例给这个私有的构造函数

相关问题