2012-09-09 42 views
3
class Temp 
{ 
    { 
     System.out.println("this is in it block"); 
    } 


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

上面的代码不会打印init块的内容,但我们知道init块是构造函数的第一行。是否有必要在Java中的每个类中都有构造函数

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

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

+1

请查看常见问题解答如何正确标记您的问题。这确保您的问题得到正确的人的关注。 –

+0

init代码块是构造函数的* second *行,在implict或显式super()调用之后。 – EJP

回答

0

有没有在你的代码调用构造函数,因此实例初始化块不会被调用无论是。

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

号为什么要这样呢?你将不得不致电它的发生。它不会因为它存在而运行。

5

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

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(); 
} 
相关问题