一道题诠释代码块,构造器之间的优先顺序
不要先看答案,自己思考后再把答案写在纸上!!
class ClassCC{
static ClassCC instance = new ClassCC();//属于静态成员
static {//属于静态成员,静态代码块在类加载时可以初始化,假如有多个静态成员,则会按照编写的顺序执行
System.out.println("父类静态代码块");
}
{//实例代码块(每次构建对象都会执行)
//实例代码块,每次生成类实例都会执行,并且,实例代码块的执行优先于构造器
System.out.println("父类代码块");
}
public ClassCC(){//构造器
System.out.println("父类无参构造器");
}
public ClassCC(String g){
System.out.println("父类有参构造器");
}
}
class ClassC1 extends ClassCC{
static ClassC1 instance = new ClassC1();//属于静态成员
static {//属于静态成员,静态代码块在类加载时可以初始化,假如有多个静态成员,则会按照编写的顺序执行
System.out.println("子类静态代码块");
}
{//实例代码块(每次构建对象都会执行)
//实例代码块,每次生成类实例都会执行,并且,实例代码块的执行优先于构造器
System.out.println("子类代码块");
}
public ClassC1(){
System.out.println("子类无参构造器");
}
public ClassC1(String g){
System.out.println("子类有参构造器");
}
}
public class Test4 {
public static void main(String[] args) {
ClassC1 c2 = new ClassC1("g");//创建子类对象,调用子类有参构造器
System.out.println(c2);
ClassC1 c1=ClassC1.instance;
System.out.println(c1);
}
}
运行结果
规则:
- 当创建一个类或者加载类的具体成员时,它的父类静态成员最先调用,然后是子类的静态成员。(属性和方法不分优先级,只看编译顺序)
- 构造器里调用顺序super()绝对是第一行(未写明this,或者其他super(" ")等方法),非静态代码块第二行,然后是构造成员。
弄清楚规则后再看代码就能搞懂了,作者自己初学java,第一次做也错了。多做几遍,理解就会很深了。