静态方法的执行顺序(JAVA)

时间:2016-11-20 03:28:49

标签: java methods static

我在网上搜索了很长时间。但没用。请帮忙或尝试给出一些如何实现这一点的想法?为什么结果不打印第一个“int main”?我想知道的是为什么这个程序的结果如下?先谢谢。

超静态块

静态区块4

中的

超级构造函数

构造

 class StaticSuper {
        static {
            System.out.println("super static block");   
        }


        StaticSuper() {
            System.out.println("super constructor");    
        }
    }

    public class StaticTests extends StaticSuper {
        static int rand;

        //static  initialise 
        static {           
        rand = (int) (Math.random() * 6);
        System.out.println("static block " + rand);     
        }   

        StaticTests() {
            System.out.println("constructor");  
        }

        public static void main(String[] args) {
            System.out.println("in main");
            StaticTests st = new StaticTests(); 
        }
    }

2 个答案:

答案 0 :(得分:1)

点火顺序为:

  1. 按出现顺序显示的父静态块和字段
  2. 外观顺序的子静态块和字段
  3. 父级非静态字段初始值设定项
  4. 父构造函数

  5. 子非静态字段初始值设定项

  6. 子构造函数
  7. 您可以阅读有关here

    的更多信息

    <强>更新

    运行它,你就会明白为什么不应该在超类构造函数中调用非final方法。

    public class Derived extends Super
    
    {
    
        @Override
        void initialise()
        {
            System.out.println("Now you can't initialise field \"a\" anymore");
        }
        Derived()
        {
    
        }
        public static void main(String[] args)
        {
            Derived d = new Derived();
    
        }
    }
    
    class Super
    {
        private int a;
        void initialise()
        {
            a = 10;
        }
        Super()
        {
            initialise();
        }
    }
    

    因此,您无法初始化您的字段a,这可能会破坏您的super类代码。

    final方法无法覆盖。因此,您可以初始化字段a,并且不会破坏super类中的任何内容。

    我希望它能澄清你的怀疑。

答案 1 :(得分:1)

序列如下:

  1. 您输入java StaticTests

  2. JVM加载StaticTests

  3. JVM找到static void main(String[])方法并尝试调用它。

  4. main(...)的调用会触发StaticTests的静态初始化。 (在第一次调用静态方法之前初始化一个类。)

  5. StaticTests的静态初始化触发了StaticSuper的静态初始化。 (必须在初始化类之前初始化类超类。)

  6. “超静态块”由超静态初始化打印。

  7. “static block 4”由子类static init。

  8. 打印
  9. main(...)来电开始。

  10. 执行System.out.println("in main")语句,在“主要”中打印。

  11. new StaticTests调用StaticTests构造函数。

  12. StaticTests构造函数隐式调用super()。 (正常的Java行为。)

  13. 超类构造函数打印“超级构造函数”。

  14. 子类构造函数打印“constructor”