继承时构造函数的执行顺序问题、含构造代码块以及静态代码块时在new对象时的执行顺序、变量初始化的声明顺序

一 继承时构造函数的执行顺序

只要记住一点:每个类的构造器中第一行不是this就是super,并且只能有一个,调用super的时候就去执行父类的构造器了,调用this就是在调用本类中的重载构造器。

       1 在类的一般方法里都有默认:this 用于指向当前对象,在构造函数中都有隐式的:super 用于指向父类

       2  如果在构造函数里第一行写了this();那么super();语句在函数里不存在——因为this 和super 只能在第一行

       3  父类的父类是?---在Java体系设计中,定义了一个所有类的父类object(在虚拟机启动时就存在了)

构造函数:


class 类名{
类名(){
super();   //一般是隐式的,首先执行该super,再执行下面的语句,并且,当父类的构造器显示重载定义时,如果没有将父类无参构造器显示化,那么就会出现问题,eclipse会提示父类必须显示构造一个无参构造器
对象的显式初始化
    }
}

在调用构造函数时,会先执行super  进入父类的构造函数初始化父类,再返回子类的构造函数,将子类的对象显示初始化

二 含构造代码块以及静态代码块时在new对象时的执行顺序

在新建对象时,当有静态的内容时,如静态成员变量,静态构造代码块,一定是先执行静态的,再执行非静态的

                         2 静态之间的执行顺序是按照在类中的先后顺序

                         3 静态的只加载一次

                         4 没有静态构造函数

搞懂下面这两个示例,基本上就掌握了,再运行该示例的时候,可以调整一下各种顺序,看看输出结果是怎样的。

上面这四个步骤在没有发生父类构造函数调用子类重写方法的时候是可以这样记忆的,一般也适用。具体的new对象时,这个过程到底发生了什么,参看本人的原文博客:

博客名:父类构造函数调用了子类中重写的方法,以及变量初始化过程,这个过程到底发生了什么???

博客链接:https://mp.csdn.net/postedit/94552942

示例1:输出结果都是数字的顺序,比较易懂

class F{
     static S s=new S();
     {
          System.out.println(2);
     }
     static {
          System.out.println("4");
     }
      public F(){
          System.out.println("1");
     }
     
     
}
class S {
     public S(){
          System.out.println(5);
     }
}

示例2:有点抽象,但是掌握住静态的只在第一次new的时候加载一次这个要点,就可以做出来(我下面的注释才是重点)

main函数:ParentClass p=new ParentClass();

class ParentClass{
     static int num = 0;//1
     String name = "qqqqqq";
     static String name2 = "wwwwwwwwwww";//2
     static ParentClass parentClass = new ParentClass();//3
     ParentClass(){                                            
          System.out.println("这里是构造函数*************");    
     }
     {              //非静态代码块,每new一次都会运行该代码块一次,与static的区别就在于此。
          System.out.println("name1:" + name);
          System.out.println("这里是块1============");
     }
     static {//4   这个静态代码块在main中new的时候就已经加载进来了,
//但是并未执行,先执行的是3 ,3在new的过程中,并不会加载该类中的static变量和代码块,因为static在new的时候 只加载一次。
          num += 1;
          System.out.println("parentClass.parentClass.parentClass.name:"+parentClass.name);
          System.out.println("这里是静态块*************" +  num);
     }
}

三 成员变量初始化的声明顺序

下面这四个步骤在没有发生父类构造函数调用子类重写方法的时候是可以这样记忆的,一般也适用。具体的new对象时,这个过程到底发生了什么,参看本人的原文博客:

博客名:父类构造函数调用了子类中重写的方法,以及变量初始化过程,这个过程到底发生了什么???

博客链接:https://mp.csdn.net/postedit/94552942

      声明处初始化和构造块初始化的顺序,具体哪个先初始化,看两者在类中的顺序,谁在前谁就先初始化。

      new一个对象的变量初始化的过程:(1,2,3,4是执行的顺序,最后一个执行的就是构造器的初始化)

1 默认初始化   (int a;//此时会默认初始化)

2 声明处初始化 (如 int a=4;)

3 构造块初始化(2,和3 看其在代码中的放置顺序)

4 构造器初始化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值