java代码块
一、代码块的使用
当一个类有多个构造函数,并且构造函数都有相同的语句,可以将这些语句放入一个代码块中,提高代码重用。代码块就相当于另一种构造器的形式。
1、语法:【static】{
语句
};
2、分类:代码块分为静态代码块和普通代码块
二、静态代码块和普通代码块区别
- static代码块随着类的加载而执行,而且只会执行一次。
- 普通代码块则随着对象的创建而执行,每创建一次对象,就执行一次。
什么时候类会被加载:(可能不单单以下情况,其他情况还未去了解)
- 创建对象实例时
- 创建子类对象时,父类也会被加载
- 使用静态成员时
三、创建子类时类的调用顺序
1.父类静态变量初始化和静态代码块被调用(优先级一样,看代码顺序):创建一个子类对象,首先加载父类信息,因为静态属性会随类的加载被初始化,静态代码块随类的加载而被调用。
2.子类静态变量初始化和静态代码块被调用(优先级一样,看代码顺序):父类加载完后,就开始加载子类,所以静态属性会被初始化,静态代码块被调用。
3.父类普通变量初始化和普通代码块被调用(优先级一样,看代码顺序):子类加载完后,在堆里分配完空间,就会开始使用构造器初始化,但是构造器里前两句其实隐含了super() 和 调用普通代码块与普通变量初始化,所以开始执行父类的构造函数,同时父类构造函数也隐含了这两句,但是父类的super()可能是object类的构造函数,所以也看不出来调用,所以执行父类普通变量初始化和调用普通代码块。
4.父类构造函数:父类执行构造函数隐含的前两句后,因为还处于构造函数中,所以执行剩余的构造语句。
5.子类普通变量初始化和普通代码块被调用(优先级一样,看代码顺序):子类构造函数隐含的第一句super()被执行后就开始执行第二句,子类普通变量初始化和调用普通代码块。
6.子类构造函数:子类执行构造函数隐含的前两句后,因为还处于构造函数中,所以执行剩余的构造语句。
package com.hb.CodeBlock;
public class codeBlockDetail {
public static void main(String[] args) {
new B02();
}
}
class A02 { //父类
private static int n1 = getVal01();//静态属性的初始化
static {
System.out.println("A02 的一个静态代码块..");
}
{
System.out.println("A02 的第一个普通代码块..");
}
public int n2 = getVal02();//普通属性的初始化
public static int getVal01() {
System.out.println("静态属性n1被初始化");
return 10;
}
public int getVal02() {
System.out.println("普通属性n2被初始化");
return 10;
}
public A02() {
// 隐藏
//super()
//普通代码和普通属性的初始化
System.out.println("A02 的构造器");
}
}
class B02 extends A02 {
private static int n3 = getVal03();//静态属性的初始化
static {
System.out.println("B02 的一个静态代码块..");
}
public int n4 = getVal04();//普通属性的初始化
{
System.out.println("B02 的第一个普通代码块..");
}
public static int getVal03() {
System.out.println("静态属性n3被初始化");//(3)
return 10;
}
public int getVal04() {
System.out.println("普通属性n4被初始化");//(8)
return 10;
}
public B02() {
// 隐藏
//super()
//普通代码和普通属性的初始化
System.out.println("B02 的构造器");
}
}