-
什么是构造方法?
* 给对象的数据(属性)进行初始化 -
构造方法格式特点?
* 方法名与类名相同(大小也要与类名一致)
* 没有返回值类型,连void都没有 -
什么是构造代码块? (初始化块)
* 在类中方法外出现;
* 作用是:多个构造方法中相同的代码存放到一起;
*每次调用构造都执行,并且在构造方法前执行
-
什么是静态代码块?
* 在类中方法外出现,并加上static修饰;
* 用于给类进行初始化(加载驱动);
*静态代码块优先于主方法执行,类一加载就执行,并且只执行一次
案例:下面的代码输出结果是?
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
}
}
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
输出结果:
原因:
/*
* 1. jvm调用了Main方法,main进栈
* 2. 遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象(首先加载的是父类(没有父哪来的子))
* 3. 当Fu.class加载进内存的时候,父类的静态代码块会随着Fu.class一起加载
* 4. 当Zi.class加载进内存的时候,子类的静态代码块会随着Zi.class一起加载
* 5. 然后走子类的构造方法,因为子类的构造方法中默认super(),所以先走的是父类的构造方法,但是在执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的
* 6. 执行完父类,执行子类,顺序如第五步。
*/