4
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

4 回答 4

6

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

于 2012-09-09T15:57:34.637 回答
1
{ System.out.println("this is in it block");

}

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

于 2012-09-09T15:59:49.530 回答
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();
}
于 2012-09-09T16:14:15.433 回答
0

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

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

不,为什么要这样做?你必须调用它才能发生这种情况。它不会仅仅因为它存在就运行。

于 2012-09-09T23:57:50.607 回答