class test {
test() {
System.out.println("Constructor");
}
{
System.out.println("Hai");
}
}
public class sample {
public static void main(String [] a) {
test t = new test();
}
}在上面的代码中,为什么大括号((即) "Hai")中给出的语句是在构造函数执行之前打印的。
发布于 2009-12-12 20:50:56
让我们用一个更清楚的例子来表达:
public class Test {
static {
System.out.println("static initializer");
}
{
System.out.println("instance initializer");
}
public Test() {
System.out.println("constructor");
}
}并按如下方式进行测试:
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}输出:
static initializer
instance initializer
constructor
instance initializer
constructor在运行时,特别是在类的加载期间,静态初始化器只执行一次。在构造函数之前的每次实例化过程中都会执行实例初始化器。
您可以拥有多个它们,并且它们将按照它们在编码中出现的顺序执行。
实例初始化器的主要优点是,无论您使用哪个构造函数,都会执行它们。它们适用于每一种方法,因此您不需要在所有方法上重复相同的初始化。
静态初始化器的主要优点是它们在类加载期间只执行一次。现实世界中一个众所周知的例子是JDBC驱动程序。当你这样做的时候
Class.forName("com.example.jdbc.Driver");它只执行static初始化器,那么任何(像样的) JDBC驱动程序都会在DriverManager中注册自己,如下所示:
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}这样,DriverManager就可以在getConnection()期间找到正确的JDBC驱动程序。
发布于 2009-12-12 20:33:39
是。这是个instance initializer。一旦类被实例化,它就会立即运行。
发布于 2009-12-13 07:44:33
在上面的代码中,为什么大括号((即) "Hai")中给出的语句是在构造函数执行之前打印的。
因为这是Java Language Specification的12.5 Creation of New Class Instances小节中描述的预期行为:)
在将对新创建的对象的引用作为结果返回之前,将使用以下过程处理指定的构造函数以初始化新对象:
this)开始,则使用这五个相同的步骤计算参数并递归处理该构造函数调用。如果构造函数调用突然完成,则由于同样的原因,此过程也会突然完成;否则,请继续执行步骤5。this)开始。如果此构造函数用于Object以外的类,则此构造函数将从显式或隐式调用超类构造函数(使用super)开始。使用同样的五个步骤,递归地计算参数并处理超类构造函数调用。如果构造函数调用突然完成,则此过程也会出于同样的原因突然完成。否则,继续执行类的实例初始化器和实例变量初始化器的步骤4.有关...的更多详细信息,请参阅8.6 Instance Initializers部分。实例初始化器。
https://stackoverflow.com/questions/1893274
复制相似问题