• java中代码块和构造方法以及普通方法的代码执行顺序总结


    说实话,这块真的不好理解啊~都怪jvm  执行顺序搞这么复杂,哼╭(╯^╰)╮ 但是  我们能怎么办,只能研究呗!!!

    !:首先,毫无置疑的,静态代码块在加载时就执行了,所以肯定是最先执行的。。。。

    2:老师是不是说过,非静态代码块是在每次实例化对象时被调用的,那问题就来了,是非静态代码块中的内容先执行的,还是构造方法中的内容执行的呢?

      其实:在Child Child = new Child()时,new Child()时就会创建一个对象了,但是这个对象还不会执行构造方法中的内容,然后带着这个创建的这个对象去执行非静态代码块中的 内容,执行完后,就去执行构造方法中的内容了,重点来了,其实在执行非静态代码块之前,会带着这个对象执行类中的成员变量部分,因为已经有了对象,所以就有了依附于对象的这些属性,那么这时这些属性的初始值就是这些属性的数据类型初始值,如果这些属性被赋值了,然后再被赋值。其实顺序就是:

      

             用new创建并初始化对象步骤:
          给对象的实例变量(非“常量”)分配内存空间,默认初始化成员变量;
          成员变量声明时的初始化;
         初始化块初始化(又称为构造代码块或非静态代码块);
         构造方法初始化

    下面的代码会帮助你理解

     1 package thisTest;
     2 
     3 public class Child {
     4     
     5     private static String name;
     6     
     7     static {
     8         System.out.println("我是静态代码块!!!!!!所以我不能用this~"+name);
     9     }
    10 
    11     {
    12         System.out.println(this+"我是动态代码块"+this.name);
    13     }
    14     public Child(String name) {
    15         this.name = name;
    16         System.out.println(this+"我是构造方法"+this.name);
    17     }
    18     
    19     public static void main(String[] args) {
    20         Child child=new Child("张三");
    21         System.out.println(child+"普通方法"+child.name);
    22     }
    23 }

    输出结果:

    我是静态代码块!!!!!!所以我不能用this~null
    thisTest.Child@52e922我是动态代码块null
    thisTest.Child@52e922我是构造方法张三
    thisTest.Child@52e922普通方法张三

    执行的顺序为

    11111111111111111111111

    2222222222222222222222222222

    3333333333333333333333333

    444444444444444444444444444444

    这就很好理解了吧~

    好了 ,

    不用谢我, 我是雷锋!告辞—— 

  • 相关阅读:
    python基础一 day40 守护线程
    python基础一 day40 线程复习
    python基础一 day39 线程探索
    python基础一 day39 复习-回调函数
    python基础一 day38 进程池代码
    python基础一 day38 进程间的数据共享
    python基础一 day38 管道
    python基础一 day18 认识正则表达式及探索
    python小白-day3 函数
    python小白-day3 深浅拷贝
  • 原文地址:https://www.cnblogs.com/lyxcode/p/9016322.html
Copyright © 2020-2023  润新知