是否有必要在Java中的每个类中都有一个构造函数

时间:2012-09-09 15:52:46

标签: java oop constructor

class Temp
{ 
   {
      System.out.println("this is in it block");
   }


   public static void main(String... s)
   {
      System.out.println("abhi");
   }
}

上面的代码不会打印init块的内容,但我们知道init块是构造函数的第一行。

但另一方面,如果我使用new Temp();,它会被打印出来。为什么这样?

如果构造函数在每个类中,上面的代码也应该在没有对象初始化的情况下打印它。不应该吗?

4 个答案:

答案 0 :(得分:5)

您不需要在类中编写构造函数代码。如果您没有任何构造函数,系统将自动为您生成默认构造函数。你的内部块称为instance initializer;在构造函数执行之后,在构造函数中对super(...)的任何调用之后以及构造函数体的(其余部分)之前运行之后运行。 (如果构造函数以对this(...)的调用开始,则不会为该构造函数运行实例初始值设定项。)但是,您需要为构造函数和要执行的任何实例初始化程序创建类的实例。 (如果您创建了内部块static,它将是一个静态初始化程序,并且在初始化类对象时将运行一次,无论是否创建了实例。)

答案 1 :(得分:1)

{ System.out.println("this is in it block");

}

为您创建的每个对象调用。即使您不创建对象,也会调用static {}。 有关详细信息,请参阅static-and-instance-initializers-in-javastatic-and-instance-initializers-in-java

答案 2 :(得分:0)

您好,如果您运行此代码您将了解实例块和静态块之间的区别。

它是第一个运行的静态块,只运行一次,第一次在实例启动时调用静态方法。就像在你的代码中你调用静态方法(main)一样,你应该创建一个静态块,但它只调用一次。

实例块,它始终运行它启动实例。

class Temp
{
    {System.out.println("this is an instance block");}

    static {System.out.println("this is a static block");}

    public static void main(String... s){
        System.out.println("This a static method");
        Temp myTemp = new myTemp();
        myTemp.myMethod();
    }

    void myMethod (){
        System.out.println("This an instance method");
    }
}

另一方面,如果你没有输入任何构造,Java会为你创建一个

Temp(){//Or whatever name of your class
    super();
}

答案 3 :(得分:0)

您的代码中没有任何内容可以调用构造函数,因此实例init块也永远不会被调用。

  

如果构造函数在每个类中,上面的代码也应该在没有对象初始化的情况下打印它。不应该吗?

没有。为什么要这样?您必须调用才能实现此目的。它不会因为它存在而不会运行。