• 【春招】 java static 执行顺序


     1 package static类型.执行顺序;
     2 
     3 public class Test {
     4     Person person = new Person("Test");
     5     static{
     6         System.out.println("test static");//1
     7     }
     8 
     9     public Test() {
    10         System.out.println("test constructor");//5
    11     }
    12 
    13     public static void main(String[] args) {
    14         new MyClass();
    15     }
    16 }
    17 
    18 class Person{
    19     static{
    20         System.out.println("person static");//3
    21     }
    22     public Person(String str) {
    23         System.out.println("person "+str);//4//6
    24     }
    25 }
    26 
    27 
    28 class MyClass extends Test {
    29     Person person = new Person("MyClass");
    30     static{
    31         System.out.println("myclass static");//2
    32     }
    33 
    34     public MyClass() {
    35         System.out.println("myclass constructor");//7
    36     }
    37 }

    解释:
    1.执行main方前会加载Test类,执行static 输出:test static
    2.执行new MyClass() 先加载MyClass,但是发现继承Test,而Test已经加载过了不需要加载了,所以加载MyClass,执行static代码块,输出myclass static
    3.1 加载完后MyClass要通过构造函数生成对象,但是要先初始化父类的成员变量,会执行Person person = new Person("Test");,于是要加载Person类,加载的时候执行static代码块,输出person static
    3.2 然后在new Person,执行Person的构造函数,输出:person Test
    4.再执行Test的构造函数,输出test constructor
    5.1执行Person person = new Person("MyClass");,再次执行Person的构造函数,输出:person MyClass
    5.2最后执行MyClass的构造函数,输出myclass constructor

    注:针对3.2-4,5.1-5.2不论变量放在哪儿,都会先于任意一个方法的执行前执行,包括构造方法,而构造方法是一个类必须会执行的方法,不需要显示的进行调用。同时,不论变量在哪儿分布,只要在方法外部,就一定先于方法初始化。

  • 相关阅读:
    RabbitMQ
    连接池,为什么要使用连接池?
    mac 安装arcanist
    感触
    UDP socket
    Servlet过滤器
    PL、SQL
    springmvc 文件上传实现(不是服务器的)
    注解spring
    excel工具类
  • 原文地址:https://www.cnblogs.com/jianghengsh/p/12430153.html
Copyright © 2020-2023  润新知