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 构造方法

  • 相关阅读:
    2017.04.05-2017.07.14封闭开发总结
    Android读取Manifest文件下Application等节点下的metadata自定义数据
    MyEclipse Hibernate Reverse Engineering 找不到项目错误
    web服务器决定支持多少人同时在线的因素
    配置servers时,错误:Setting property 'source' to 'org.eclipse.jst.jee.server:hczm' did not find a matching property
    查看端口被占用
    高德开发 android 出现 key 鉴权失败
    Android EventBus
    javascript 中的数据驱动页面模式
    读书笔记之
  • 原文地址:https://www.cnblogs.com/dijia478/p/14164057.html
Copyright © 2011-2022 走看看