2013-08-01 79 views
2

我正在学习Java SE 7考试,我正在查看示例问题。我似乎无法弄清为什么下面的程序以x y c g的顺序返回。Java SE 7:执行顺序

我明白为什么x首先运行,因为它是一个静态初始化块,但有人可以解释为什么ycg之前运行?

public class Triangle { 
Triangle() { 
    System.out.print("c "); 
} 

{ 
    System.out.print("y "); 
} 

public static void main(String[] args) { 
    new Triangle().go(); 
} 

void go() { 
    System.out.print("g "); 
} 

static { 
    System.out.print("x "); 
} 
} 
+0

@jlordo,你是对的。当在线搜索时,从来没有发现过这个问题 – theBigOzzy

回答

4
{ 
    System.out.print("y "); 
} 

是一个实例初始化块和被构造之前运行。因此,代码相当于:

Triangle() { 
    System.out.print("y "); //initialisation block 
    System.out.print("c "); 
} 
+0

所以你可以在一个类中有多于一个初始化块的实例吗?如果是这样,这些按特定顺序运行? – theBigOzzy

+1

@theBigOzzy是的,你可以和他们运行程序的顺序(即按照它们出现在你的代码中)。它在[JLS#12.5](http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5)中定义,步骤4:*执行实例初始值设定项和这个类的实例变量初始值设定项按照从左到右的顺序排列,它们以文本形式出现在类的源代码中* – assylias

-1

在内存中的第一个IIB和SIB得到执行,然后你的主函数加载到堆栈,这就是为什么你得到这个输出。 因为它名字建议IIB(intilised实例块)这是非常重要的静态是像在海上漂浮的自由水手可以在主要方法执行之前被任何类使用。

public class TestFirst 

{ 
System.out.println(" From IIB"); 

} 
static 
{ 
    System.out.println("SIB "); 
} 

    public static void main(String [] args){ 

System.out.println(" TestFirst "); 

} 

} 
+0

...“static就像是漂浮在海上的自由水手”?什么? – eis

+0

@上一页。完全错误。在类加载之后执行'static'块,而不是在它之前执行。构造函数只在创建类的实例时执行,而不是在类加载时执行。 –

+0

[@eis](http://stackoverflow.com/users/365237/eis)里面有很多种静态的东西,如果我没有明确地提到静态的时候,不要介意。有很多类型的静态有没有像变量一样,任何人都可以使用任何方法,这就是为什么我称自由水手和海意味着我们为程序记忆的原因 – Sheel

2

“y”在块语句内,而不在方法中。因此,在创建实例Triangle时,即使在构造函数之前,块内部的语句也会被执行。