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

  • 相关阅读:
    本地http://localhost打不开怎么办
    C#中lock死锁实例教程
    结对-四则运算答题器-项目进度
    Forward团队-爬虫豆瓣top250项目-代码设计规范
    Forward团队-爬虫豆瓣top250项目-设计文档
    学习使用github
    Forward团队-爬虫豆瓣top250项目-团队编程项目开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    20170915-构建之法:现代软件工程-阅读笔记
    结对-四则运算答题器-设计文档
  • 原文地址:https://www.cnblogs.com/dijia478/p/14164057.html
Copyright © 2011-2022 走看看