类的成员:代码块(或初始化块)
- 代码块如果有修饰的话只能用static修饰
- 分类:静态代码块 VS 非静态代码块
- 静态代码块:
//静态代码块,由一对大括号组成 static{ }
4.1.内部可以有输出语句。
4.2.随着类的加载而执行,而且只执行一次。
4.3.作用:初始化类的信息。
4.4.如果一个类中定义了多个代码块,则按照声明代码块的先后顺序执行。
4.5.静态代码块的执行要优先于非静态代码块的执行。
4.6.静态代码块内只能调用静态的属性,方法,不能调用非静态的结构。
5.非静态代码块
{ }
5.1.内部可以有输出语句。
5.2.随着对象的创建而执行。
5.3.每创建一个对象就执行一次非静态代码块。
5.4.作用:可以在创建对象时,对对象的属性进行初始化。
5.5.如果在一个类中,定义了多个非静态代码块,则按照声明的先后顺序执行。
5.6.非静态代码块中,可以调用静态的属性,方法也可以调用非静态的属性,方法。
代码块的执行顺序优先于构造器。
重点:类什么时候被加载:
- 创建对象实例时(new)
- 创建子类对象实例,父类也会被加载
- 使用类中的静态成员时(静态属性,静态方法)
另:对属性可以赋值的位置:
- 默认初始化
- 显示初始化
- 构造器中初始化
- 有了对象以后,可以通过“对象.属性”或“对象.方法”进行初始化赋值
- 在代码块中赋值
执行的先后顺序:1 - 2/5 - 3 - 4
重点:
案例代码如下:
public class CodeBlockDetail04 { public static void main(String[] args) { //1.先进行类的加载 //1.1 先加载父类 A02 再加载B02 //2.创建对象 //2.从子类的构造器开始 B02 b02 = new B02(); } } class A02 { private static int n1 = getVal01(); static { System.out.println("A02的静态代码块");//(2) } { System.out.println("A02的普通代码块"); //(5) } public int n3 = getVal02(); //普通属性的初始化 private int getVal02() { System.out.println("getVal02"); //(6) return 10; } private static int getVal01() { System.out.println("getVal01");//(1) return 10; } public A02() { //隐藏 //super() //普通代码块 System.out.println("A02的构造器"); //(7) } } class B02 extends A02 { private static int n3 = getVal03(); static { System.out.println("BO2的静态代码块");//(4) } public int n5 = getVal04(); { System.out.println("B02的普通代码块");//(9) } private int getVal04() { System.out.println("getVal04"); //(8) return 10; } private static int getVal03() { System.out.println("getVal03");//(3) return 10; } public B02() { //隐藏 //super() //普通代码块 System.out.println("B02的构造器"); //(10) } }
输出结果如下:
getVal01 A02的静态代码块 getVal03 BO2的静态代码块 A02的普通代码块 getVal02 A02的构造器 getVal04 B02的普通代码块 B02的构造器