- 代码块的概述
- 代码块的分类
根据位置和声明不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块
- 局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率
- 构造代码块(初始化块):在类中方法外出现
- 静态代码块:一般用于加载驱动
static{}
- 测试代码
public class face_code_question {
public static void main(String[] args) {
System.out.println("我是主方法");
question s=new question();
question s1=new question("清杉夫人");
{
System.out.println("我是局部代码块");
}
}
static {
System.out.println("我是主方法类中的静态代码块");
}
}
class question {
private String name;
public question() {
System.out.println("我是无参构造");
}
public question(String name) {
this.name=name;
System.out.println("我是有参构造");
}
{
System.out.println("我是构造代码块");
}
static {
System.out.println("我是静态代码块");
}
}
- 运行结果
- 总结
- 局部代码块:在方法中出现
- 构造代码块:在类中方法外出现,随着对象的创建而加载,创建一次对象构造代码块执行一次
- 静态代码块:随着类的加载而加载,并且只执行一次(一般用于加载驱动)
- 主方法类中的静态代码块:优先于主方法执行
- 面试题
public class face_extends_question_2 {
public static void main(String [] args) {
Zi s=new Zi();
}
}
class Fu {
static {
System.out.println("父类 静态构造代码块");
}
{
System.out.println("父类 构造代码块");
}
public Fu () {
System.out.println("父类 构造方法");
}
}
class Zi extends Fu {
static {
System.out.println("子类 静态构造代码块");
}
{
System.out.println("子类 构造代码块");
}
public Zi() {
System.out.println("子类 构造方法");
}
}
- 运行结果
- 分析
- jvm调用了main方法,main方法进栈
- 遇到zi s=new zi();会先将fu.class和zi.class分别加载近内存,在创建对象,当fu.class加载进内存
父类的静态代码块会随着父类的加载而加载,当Zi.class加载进内存,子类中的静态代码块会随着子类的加载而加载。 - 走子类的构造方法,因为Java中是分层初始化的,先初始化父类,在初始化子类,所以先走父类构造,但是在执行父类构造是,发现父类构造中有构造代码块,构造代码块是优先于构造方法执行的,所以打三个输出父类的构造代码块,接着输出父类的构造方法
- 父类的构造方法初始化完成,走子类的构造方法,子类中也有优先于构造方法的构造代码块,所以先显示子类中的构造代码块,再显示子类的构造方法