• Java中四大代码块的运行顺序(附code)


    验证证的方法是写code。例如以下:

    public class test {
    
        
        static class A {
            public static String name = "hello";
    
            static {
                System.out.println("A static block1"); //1
            }
    
            {
                System.out.println("A block3"); //3
            }
    
            public A() {
                System.out.println("A constructor4"); //4
            }
        }
    
    
        static class B extends A {
            public static String childName = "hello";
    
            static {
                System.out.println("B static block2"); //2
            }
    
            {
                System.out.println("B block5"); //5
            }
    
            public B() {
                System.out.println("B constructor6"); //6
            }
        }
    
        
        public static void main(String[] args) {
           new B();
        }
    
    }
    以上运行结果为:
    A static block1
    B static block2
    A block3
    A constructor4
    B block5
    B constructor6

    • 分析:当运行new B()时。它首先去看父类里面有没有静态代码块,假设有,它先去运行父类里面静态代码块里面的内容。当父类的静态代码块里面的内容运行完成之后。接着去运行子类(自己这个类)里面的静态代码块,当子类的静态代码块运行完成之后,它接着又去看父类有没有非静态代码块,假设有就运行父类的非静态代码块,父类的非静态代码块运行完成。接着运行父类的构造方法;父类的构造方法运行完成之后,它接着去看子类有没有非静态代码块,假设有就运行子类的非静态代码块。

      子类的非静态代码块运行完成再去运行子类的构造方法,这个就是一个对象的初始化顺序。

       

    • 总结:对象的初始化顺序:首先运行父类静态的内容,父类静态的内容运行完成后,接着去运行子类的静态的内容,当子类的静态内容运行完成之后,再去看父类有没有非静态代码块。假设有就运行父类的非静态代码块,父类的非静态代码块运行完成,接着运行父类的构造方法。父类的构造方法运行完成之后,它接着去看子类有没有非静态代码块,假设有就运行子类的非静态代码块。子类的非静态代码块运行完成再去运行子类的构造方法。总之中的一个句话,静态代码块内容先运行,接着运行父类非静态代码块和构造方法,然后运行子类非静态代码块和构造方法。 
    • 注意:子类的构造方法,无论这个构造方法带不带參数,默认的它都会先去寻找父类的不带參数的构造方法。假设父类没有不带參数的构造方法,那么子类必须用supper关键子来调用父类带參数的构造方法,否则编译不能通过。


  • 相关阅读:
    Auto X2021 K Increasing Sequence
    拉普拉斯平滑处理 Laplace Smoothing
    博学之
    Python-生成音乐-pyshnth
    Python-Kivy ImportError: DLL load failed: 找不到指定的模块
    Python-Word模板填充-docxtpl
    Python-文字转语音-pyttsx3
    Virtual Box中Ubuntu使用"桥接网卡"不能联网而使用"网络地址转换(NAT)"却可以上网
    STM32的HAL库中的DMA_FLAG_TCIF3_7等几个宏定义的含义
    Linux下编写互相通信的驱动模块并将其加入到内核中
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6928964.html
Copyright © 2020-2023  润新知