JavaSE7:执行顺序
我正在为JavaSE7考试学习,我正在看一些示例问题。我似乎不明白为什么下面的程序以JavaSE7:执行顺序,java,Java,我正在为JavaSE7考试学习,我正在看一些示例问题。我似乎不明白为什么下面的程序以xycg的顺序返回 我理解为什么要先运行x,因为这是一个静态初始化块,但是有人能解释一下为什么y要在c和g之前运行吗 public class Triangle { Triangle() { System.out.print("c "); } { System.out.print("y "); } public static void main(String[] args) { new
xycg
的顺序返回
我理解为什么要先运行x
,因为这是一个静态初始化块,但是有人能解释一下为什么y
要在c
和g
之前运行吗
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 ");
}
}
是实例初始化块,在构造函数之前运行。因此,该代码相当于:
Triangle() {
System.out.print("y "); //initialisation block
System.out.print("c ");
}
订单将为静态块:
static {
System.out.print("x ");
}
然后是实例初始值设定项:
{
System.out.print("y ");
}
这意味着:
Triangle() {
System.out.print("y ");
System.out.print("c ");
}
阅读:
在内存中,首先执行IIB和SIB,然后将主函数加载到堆栈中,这就是为什么要得到这个输出。 正如它的名字所暗示的IIB(初始化实例块)一样,这是非常重要的静态特性,就像漂浮在海上的自由水手一样,在执行主方法之前,任何类都可以使用它
public class TestFirst
{
System.out.println(" From IIB");
}
static
{
System.out.println("SIB ");
}
public static void main(String [] args){
System.out.println(" TestFirst ");
}
}
“y”在块语句中,而不是在方法中。因此,在创建
Triangle
的实例时,即使在构造函数之前,也会执行块内的语句。@jlordo,是的,您是正确的。在线搜索时根本没有发现这个问题,所以一个类中可以有多个初始化块实例吗?如果是这样的话,它们是否以特定的顺序运行?@theBigOzzy是的,您可以,并且它们以程序顺序运行(即它们在代码中出现的顺序)。它是在第4步中定义的:按照从左到右的顺序执行该类的实例初始值设定项和实例变量初始值设定项[…],它们以文本形式出现在该类的源代码中……“静态就像漂浮在海上的自由水手”?什么?嫉妒。完全错了<代码>静态块在类加载后执行,而不是在类加载前执行。构造函数仅在创建类的实例时执行,而不是在加载类时执行。有很多种静态存在,不介意我在提到静态时没有明确提到。有很多种静态存在,就像变量一样,方法可以被任何人使用意味着任何类这就是为什么我称之为free Seals,而sea意味着我们对program的记忆是的,你是对的。我从来不想说这可能是因为我的格式错误,所以我删除了我的评论,因为在加载类之前无法加载任何内容,当我们调用命令:java test时我会这么想。然后通过引导类加载器加载我们的类。如果我错了,请纠正我。java测试是我唯一举的例子。
public class TestFirst
{
System.out.println(" From IIB");
}
static
{
System.out.println("SIB ");
}
public static void main(String [] args){
System.out.println(" TestFirst ");
}
}