zoukankan      html  css  js  c++  java
  • 总结类初始化时的代码执行顺序

    代码块

    在Java中,使用{}括起来的代码被称为代码块。

    分类

    根据其位置和声明的不同,可以分为:

    1. 局部代码块:局部位置,用于限定变量的生命周期。
    2. 构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。
    3. 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了。作用:一般是对类进行初始化。

    上结论

    • 单个类中初始化过程:
    1. 初始化静态成员变量和静态代码块(按次序)
    2. 执行main方法
    3. 初始化普通成员变量和构造代码块(按次序)
    4. 执行构造方法

    注意
    静态代码块:只执行一次
    构造代码块:在每一次创建对象时执行

    • 涉及父类和子类的初始化过程:
    1. 初始化父类中的静态成员变量和静态代码块(按次序)
    2. 初始化子类中的静态成员变量和静态代码块(按次序)
    3. 执行子类main方法
    4. 初始化父类的普通成员变量和构造代码块(按次序)
    5. 执行父类的构造方法(注意父类构造方法中的子类方法覆盖)
    6. 初始化子类的普通成员变量和构造代码块(按次序)
    7. 执行子类的构造方法

    上代码

    class Test {
      
        static {
            System.out.println("Test 静态代码块");
        }
    
        {
            System.out.println("Test 构造代码块");
        }
    
        public Test() {
            System.out.println("Test 构造方法");
        }
      
    }
    
    public class TestDemo {
      
        static {
            System.out.println("TestDemo 静态代码块");
        }
    
        {
            System.out.println("TestDemo 构造代码块");
        }
    
        public static void main(String[] args) {
            System.out.println("TestDemo main方法");
    
            Test t1 = new Test();
            Test t2 = new Test();
        }
      
    }
    

    其运行结果是:
    TestDemo 静态代码块
    TestDemo main方法
    Test 静态代码块
    Test 构造代码块
    Test 构造方法
    Test 构造代码块
    Test 构造方法

    public class Test extends MyClass {
    
        static {
            System.out.println("Test 静态代码块");
        }
    
        Person person = new Person("Test");
    
        {
            System.out.println("Test 构造代码块");
        }
    
        public Test() {
            System.out.println("Test 构造方法");
        }
    
        public static void main(String[] args) {
            System.out.println("Test main方法");
            new Test();
        }
    
    }
    
    class Person {
    
        static {
            System.out.println("Person 静态代码块");
        }
    
        {
            System.out.println("Person 构造代码块");
        }
    
        public Person(String str) {
            System.out.println("Person 构造方法,参数是" + str);
        }
    
    }
    
    class MyClass {
    
        static Person person = new Person("MyClass");
    
        static {
            System.out.println("MyClass 静态代码块");
        }
    
        {
            System.out.println("MyClass 构造代码块");
        }
    
        public MyClass() {
            System.out.println("MyClass 构造方法");
        }
    
    }
    

    其运行结果是:
    Person 静态代码块
    Person 构造代码块
    Person 构造方法,参数是MyClass
    MyClass 静态代码块
    Test 静态代码块
    Test main方法
    MyClass 构造代码块
    MyClass 构造方法
    Test 构造代码块
    Person 构造代码块
    Person 构造方法,参数是Test
    Test 构造方法

  • 相关阅读:
    Sublime Text 2.0.2 注册码激活
    常用的接口查询,会持续更新中……
    JavaScript获取访问设备信息
    Param指南
    HTML5调用手机摄像头,仅仅支持OPPOHD浏览器
    GET传值
    关于IE缓存
    浏览器的类别及介绍
    JS调用C#中的变量
    在VS2012中设置默认启动
  • 原文地址:https://www.cnblogs.com/dijia478/p/14164057.html
Copyright © 2011-2022 走看看