0

我无法理解为什么在'c'之前打印'y'......我在这里遗漏了什么......请帮助

public class Sequence {

    Sequence() {
        System.out.print("c ");
    }

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

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

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

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

4 回答 4

1

输出是

x y c g

在java中,执行顺序如下。

  1. 加载类时调用静态块 - 打印x
  2. 创建新实例时调用初始化程序块(就在构造函数执行之前) - 打印y
  3. 构造函数 - 打印c

然后你调用了go()print的方法g

假设 Sequence 继承自 SuperSequence。

public class SuperSequence() {
    static {
        System.out.print("staic of super ");
    }
    public SuperSequnce() {
        System.out.print("constructor of super ");
    }
}

输出将是

static of super x constructor of super y c g

因为超类的静态块首先执行。然后是类的静态块Sequence

于 2013-06-09T05:22:36.873 回答
1

下面的澄清应该会有所帮助:(按顺序执行)

  • static {}:加载类时执行此块。这称为静态初始化块。
  • {}:每次创建类的新实例时都会执行此块。这称为实例初始化块。
  • Sequence():在上述块之后,构造函数在新实例创建时执行。
于 2013-06-09T05:27:17.193 回答
0

我更改了问题的源代码以在超类中添加一个超类和一个静态块。下面的代码打印:

测试静态 x zy cg

代码:

  class test{

    static{
        System.out.print("test static ");
    }

    public test(){
        System.out.print("z");
    }
  }

  class Sequence extends test { 

    Sequence(){
        System.out.print("c ");
    }

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

    public static void main(String[] args) { 

        new Sequence().go(); 
    } 

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

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

所以它就像 Luiggi Mendoza 所说的那样工作:

  1. Super 类的静态块。
  2. 子类的静态块。
  3. 超类构造函数。
  4. 初始化程序块。
  5. 子类构造函数。
于 2013-06-09T05:50:57.167 回答
0

在java中,静态块总是先执行,然后是初始化块,写成
{
//...your code to initialize any variable
}

剩下的两个像构造函数Sequence()void go();方法这样的块将相应地执行。
根据关于初始化块的java官方文档是:

Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

看看这个oracle 文档链接

于 2013-06-09T05:28:50.450 回答