codeegginterviewgroup / CodeEggDailyInterview

码个蛋每日面试题
396 stars 54 forks source link

讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。 #178

Open kukyxs opened 4 years ago

opkcloud commented 4 years ago

此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。 父类静态代变量、 父类静态代码块、 子类静态变量、 子类静态代码块、 父类非静态变量(父类实例成员变量)、 父类构造函数、 子类非静态变量(子类实例成员变量)、 子类构造函数。 示例代码: public class ClassLoaderTest { public static void main(String[] args) { son sons=new son(); } } class parent{ private static int a=1; private static int b; private int c=initc(); static { b=1; System.out.println("1.父类静态代码块:赋值b成功"); System.out.println("1.父类静态代码块:a的值"+a); } int initc(){ System.out.println("3.父类成员变量赋值:---> c的值"+c); this.c=12; System.out.println("3.父类成员变量赋值:---> c的值"+c); return c; } public parent(){ System.out.println("4.父类构造方式开始执行---> a:"+a+",b:"+b); System.out.println("4.父类构造方式开始执行---> c:"+c); } } class son extends parent{ private static int sa=1; private static int sb; private int sc=initc2(); static { sb=1; System.out.println("2.子类静态代码块:赋值sb成功"); System.out.println("2.子类静态代码块:sa的值"+sa); } int initc2(){ System.out.println("5.子类成员变量赋值--->:sc的值"+sc); this.sc=12; return sc; } public son(){ System.out.println("6.子类构造方式开始执行---> sa:"+sa+",sb:"+sb); System.out.println("6.子类构造方式开始执行---> sc:"+sc); } } 执行结果: 1.父类静态代码块:赋值b成功 1.父类静态代码块:a的值1 2.子类静态代码块:赋值sb成功 2.子类静态代码块:sa的值1 3.父类成员变量赋值:---> c的值0 3.父类成员变量赋值:---> c的值12 4.父类构造方式开始执行---> a:1,b:1 4.父类构造方式开始执行---> c:12 5.子类成员变量赋值--->:sc的值0 6.子类构造方式开始执行---> sa:1,sb:1 6.子类构造方式开始执行---> sc:12