名词解释省略,直接进入正题
1、三者在单个类中执行顺序
代码
public class Check {
static String str = "这是一个静态变量";
static {
System.out.println("这里是静态代码块。。。");
}
{
System.out.println("这里是构造代码块。。。");
}
public Check() {
System.out.println("这里是无参构造函数。。。");
}
public Check(String arg) {
System.out.println("这里是带参构造函数。。。");
}
public static void main(String[] args) {
System.out.println(Check.str);
new Check();
new Check("arg");
}
}
输出结果
这里是静态代码块。。。
这是一个静态变量
这里是构造代码块。。。
这里是无参构造函数。。。
这里是构造代码块。。。
这里是带参构造函数。。。
结论
①静态代码块在类装载时会自动执行,且仅执行一次,优先于静态变量,可用于初始化静态变量。
②每次调用构造函数,均会先调用构造代码块,多个构造函数重复代码可提取到构造代码块。
2、三者在父子类中执行顺序
代码
class Father{
static String f = "父类静态变量";
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类构造代码块");
}
public Father() {
System.out.println("父类无参构造函数");
}
public Father(String arg) {
System.out.println("父类带参构造函数");
}
}
public class Son extends Father{
static String s = "子类静态变量";
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类构造代码块");
}
public Son() {
System.out.println("子类无参构造函数");
}
public Son(String arg) {
super(arg);
System.out.println("子类带参构造函数");
}
public static void main(String[] args) {
System.out.println(Son.s);
new Son();
new Son("arg");
}
}
输出结果
父类静态代码块
子类静态代码块
子类静态变量
父类构造代码块
父类无参构造函数
子类构造代码块
子类无参构造函数
父类构造代码块
父类带参构造函数
子类构造代码块
子类带参构造函数
结论
①静态代码块在类装载时会自动执行,且仅执行一次,优先于静态变量,可用于初始化静态变量,父类优先于子类。
②调用子类构造函数,会默认先调用父类无参构造函数。调用构造函数前,均会先调用本类构造代码块。