• Java -基础知识之类的初始化顺序


    前言

    在听课时遇到的一个复杂的类初始化实例问题,在这里进行总结和反思,也是为了更好的可以回看

    问题-1

    小试牛刀O(∩_∩)O

    在这里插入图片描述

    • 主方法实例化Hongtao类

    答案为:
    getPhone
    初始化块
    构造函数

    小结: 静态>类加载>类构建;所以静态方法加载完后,从上到下执行代码。调用getPhone() 先输出getPhone,初始化块属于类加载过程,所以先于构造函数执行。

    问题-2

    进阶版

    在这里插入图片描述

    答案:
    getPhone
    静态代码块
    getPhone
    初始化块
    构造函数

    小结 :在此问题中多出来静态变量和静态初始化块的部分,需要注意的是,静态的方法也是调用时才会使用,所有静态的变量和初始化块也要按照从上到下的执行顺序。

    问题-3

    终极版

    public class InitalDemo {
        private static int k = 1;
        private static InitalDemo t1 = new InitalDemo("t1");
        private static InitalDemo t2 = new InitalDemo("t2");
        private static int i=print("i");
        private static int n = 99;
    
        {
            print("初始化块");
            j=100;
        }
        public InitalDemo(String str){
            System.out.println((k++)+":" + str + "   i="+i+ "   n=" + n);
            ++i;
            ++n;
        }
        static {
            print("静态块");
            n=100;
        }
        private int j = print("j");
        public static int print(String str){
            System.out.println((k++)+":" + str + "   i="+i+ "   n=" + n);
            ++n;
            return ++i;
        }
        public static void main(String[] args) {
                InitalDemo test = new InitalDemo("test");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    答案:
    1:初始化块 i=0 n=0
    2:j i= 1 n =1
    3:t1 i=2 n=2
    4:初始化块 i=3 n=3
    5:j i=4 n=4
    6:t2 i=5 n=5
    7:i i=6 n=6
    8:静态块 i=7 n=99
    9:初始化块 i=8 n=100
    10:j i=9 n=101
    11:test i=10 n=102

    小结

    • 此问题相对于上面一个,增加了类内调用构造函数,需要记住此时,每遇到一个调用构造函数则执行一遍类内非静态的语句,比如此问题中的初始化块>赋值>构造函数。
    • 静态变量属于所有类,所有类中的静态变量都指向同一个地址

    总结:

    首先static修饰的成员变量和方法是从属于类的, 而普通变量和方法是从属于对象的,在调用某个类的构造方法之前,应该先加载类信息,包括初始化块!之后才能创建对象!

    static 优先,但遇到new 则从上到下执行一次非静态初始化语句和初始化块和相应的构造函数

    • 当进一步涉及到继承关系时

    静态优先,构造随后, 先父再子

    父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数

  • 相关阅读:
    Learn Prompt-为什么用 ChatGPT API?
    promise笔记(三)
    非零基础自学Java (老师:韩顺平) 第11章 枚举和注解 【2 注解】
    Python爬虫编程思想(154):使用Scrapy处理登录页面
    基于51单片机的超声波测距及温度显示
    机器人革命:你一定没见过这些全新的机器人技术!
    @AutoConfigureAfter注解
    27 WEB漏洞-XSS跨站之代码及httponly绕过
    【python核心】函数式编程(二)
    MySQL【触发器】
  • 原文地址:https://blog.csdn.net/qq_45515347/article/details/126687548