代码块的概述
代码块的分类 根据位置和声明不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块
局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率 构造代码块(初始化块):在类中方法外出现 静态代码块:一般用于加载驱动 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中是分层初始化的,先初始化父类,在初始化子类,所以先走父类构造,但是在执行父类构造是,发现父类构造中有构造代码块,构造代码块是优先于构造方法执行的,所以打三个输出父类的构造代码块,接着输出父类的构造方法 父类的构造方法初始化完成,走子类的构造方法,子类中也有优先于构造方法的构造代码块,所以先显示子类中的构造代码块,再显示子类的构造方法