基于输出的排序

时间:2013-06-09 05:10:24

标签: java

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

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 个答案:

答案 0 :(得分:1)

输出

x y c g

在java中,执行顺序如下。

  1. 加载类时调用静态块 - 打印x
  2. 在创建新实例时(在构造函数执行之前)调用初始化程序块 - 打印y
  3. 构造函数 - 打印c
  4. 然后您调用了打印go()的方法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类的静态块。

答案 1 :(得分:1)

以下说明应有所帮助:(按顺序执行)

  • static {}:加载类时执行此块。这称为静态初始化块。
  • {}:每次创建类的新实例时都会执行此块。这称为实例初始化块。
  • Sequence():在上面的块之后,构造函数在新实例创建时执行。

答案 2 :(得分:0)

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

剩余的两个块,如构造函数Sequence()void go();方法将相应执行 根据关于初始化块的java的官方文档是:

  

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

看看这个oracle documentation link

答案 3 :(得分:0)

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

  

测试静态x zy c g

代码:

  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 class的静态块。
  2. 子类的静态块。
  3. 超类构造函数。
  4. 初始化程序块。
  5. 子类构造函数。