代码之家  ›  专栏  ›  技术社区  ›  cooldood3490

Java静态方法与主静态方法

  •  1
  • cooldood3490  · 技术社区  · 13 年前

    我很难理解以下代码的执行过程。我想学习Java程序,这样我就能理解所有东西是如何协同工作的。我在Eclipse中增加了断点,但没有解释原因。这是代码:

    public class Sequence {
        public 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 ");
        }
    }
    

    代码的输出是 x y c g 。有人能解释一下为什么会这样吗?我以为程序的切入点是 public static void main 但它似乎 static 首先执行?

    6 回复  |  直到 13 年前
        1
  •  3
  •   BackSlash    13 年前

    这个 static 块在 main 开始,所以 x 打印出来。

    然后我们进入主干道

    new Sequence().go();
    

    它调用 Sequence 构造函数。根据 静止的 块 之前 这个 序列 构造函数被调用(所以在新的 序列 对象被初始化),实例块(写在大括号中的块)被执行,所以 y 打印出来。

    然后构造函数调用打印 c .

    最后 go() 方法在新创建的对象上被调用,因此 g 打印出来。

    因此,全部输出将是

    x y c g
    
        2
  •  2
  •   Boris the Spider    13 年前

    JLS在这方面有所帮助, chapter 12 确切地说。

    首先 static 块将运行。当类由 ClassLoader .

    然后 main 将运行,这将由JVM执行以启动应用程序。

    然后在调用时执行构造函数 new Sequence() 。编译器会将实例初始化程序(花括号中的位)拉入构造函数的顶部(在隐式调用超类构造函数之后)。因此,花括号中的位首先运行,然后运行构造函数中的代码。

    最后是方法 go() 被调用。

    所以代码的输出是 x y c g

        3
  •  1
  •   lquitadamo    13 年前

    Java在类加载之后和任何方法之前执行静态块。Main方法是任何程序的入口点,但它是一个方法,然后是静态类初始化。

        4
  •  1
  •   user1368271 user1368271    13 年前

    在你的课堂上,你使用过

    //constructor
        public Sequence() {
            System.out.print("c ");
        }
    
        //instance init block
        {
            System.out.print("y "); 
        }
    
        //method
        void go() {
            System.out.print("g ");
        }
    
        //static init block
        static {
            System.out.print("x ");
        }
    

    ->Init块按出现的顺序执行。

    ->静态初始化块在第一次加载类时运行一次。

    ->每次创建类实例时,实例init块都会运行。

    ->实例init块在构造函数调用super()之后运行。

    ->构造函数在创建实例后运行。

    正如预期的那样,根据你所有的规则 x y c g 输出

        5
  •  1
  •   Dhruv Kapatel    13 年前

    应用程序启动时,第一个jvm加载静态块。所以首先执行静态块。 然后开始执行主方法。

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

    是构造函数块,它将被复制到每个构造函数,所以当你实例化类时,它将每次被调用。 点击 here

        6
  •  1
  •   Lucifer phtrivier    11 年前

    步骤:

    i.当加载类时,首先执行静态块。

    二、。每次实例化该类的对象时,初始化块 即

     {
       System.out.print("y ");
     }
    
     is executed(every time) and after that the time of constructor comes to be executed.
    

    iii.当对象创建完成时,执行go()方法。 因此产生了输出。