代码块

代码块

代码块可以看成一个只有方法体的方法,都是优先于类的构造器而执行。代码块有静态代码块和非静态代码块。样式如下

//下面就是一段非静态代码块(普通代码块)
{
    //方法体
};//分号可加可不加
static{//这是静态代码块
    //方法体
};//分号可加可不加

作用

代码块可以看成一种另类的构造器,当我们使用的多个构造器有很多重复语句,比如都打印一句话,就可以放在代码块中,这是一种对构造器的补充机制,大大减少了构造器的冗余代码,看起来更加的简洁。

代码块注意事项

一 加了static的代码块叫静态代码块,没有static修饰就是非静态代码块。静态代码块随着类的加载而加载,并且只会执行一次。普通代码块随着每个对象的实例化而执行。
二 类何时加载
1. 调用静态成员的时候
2. 创建实例化对象
3. 创建子类对象,父类也会加载
三 创建对象的时候,就含有普通代码块的隐式调用,每创建一个对象,便会执行一次普通代码块,如果仅使用类的静态成员就不会执行。
四 创建一个对象时,一个类的调用顺序
1. [静态部分]静态代码块和静态属性初始化,这两者优先级一样,谁写在前面就先调用谁

class A{
  private int a = 0;//静态属性(变量)初始化
  static { }; //静态代码块
}

​ 上面这个A类就会先执行a = 0,然后再执行静态代码块里的内容

  1. [非静态部分]非静态代码块和非静态属性初始化,和上面一样,谁在前面谁就先执行,但是执行的优先级是低于[静态部分]的
  class A{
  //非静态部分
  {/*非静态代码块*/};                       //1
  String name; //非静态属性初始化           //2
            
  //静态部分
  private int a = 0;//静态属性(变量)初始化  //3
  static {/*静态代码块*/};                 //4
}

执行顺序就是3 --> 4 --> 1 --> 2

​ 3. [构造器(构造方法)]最后执行,调用构造方法

五 构造器中已经隐含了super()和普通代码块的执行

    class X {//父类
        //....
    }
    class A extends X{//子类
        public A (){
            //super ();
            //普通代码块
            //构造方法
        }
    }

静态相关的代码块和属性初始化,在类的加载中完毕就执行了,因此就优先于普通代码块和构造器。

六 例子使用上面的代码,父类X子类A,当创建子类A的对象时,整个的执行顺序是什么。

1. 父类的静态部分           (静态代码块和静态属性初始化)
2. 父类的非静态部分       (非静态代码块和非静态属性初始化)
3. 父类构造器
4. 子类静态部分              (静态代码块和静态属性初始化)
5. 子类非静态部分          (非静态代码块和非静态属性初始化)
6. 子类构造器

如果是第二次创建A的对象,那么上述步骤的1和4也就是静态部分就不会重复执行,遵守静态代码块只执行一次

在向上转型的时候,如X x = new A();对象x在运行的时候是子类A对象,因此在程序中还是会如上述步骤一样123456这样跑下来

七 静态代码块只能调用静态成员,非静态代码块可以调用所有成员

成员:就是类的属性(变量)、方法的一个统称

posted @ 2021-11-11 14:36  独高的浮云  阅读(154)  评论(0)    收藏  举报