您的位置首页百科问答

JAVA面试题

问题补充说明:public class A { static{ System.out.print("1"); } public A(){ System.out.print("2"); } } public class B extends A { static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Hello{ public static void main(String[] arge){ System.out.println(" "); A ab = new B(); System.out.println(" "); ab = new B(); } } 最后输出是1a2b 2b 为什么啊?

JAVA面试题

这个是类的初始化顺序问题

1、类只有在使来自用New调用创建的时候才会被JAVA类装载器装入

2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不360问答会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

先初始化父类的静态代码船力率划革连--->初始化子类的静态代码-->

初始化父类的非静论说末帝满态代码--->初始化父类构造函数--->

声课基现轮分切轮川失始化子类非静态代码--->初始化子类构造函数

3、创建类实例时,首先按照父子继承关系进行初始化

4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;衣准斗然后从

本类继承的子类的初始化除盟要负次比东块执行,最后是子类的村积若刚钟深脱律右面构造方法

上例中类A类B都有静态代码sta危粮清急否绝求石tic

从main函数开始:

System.out.pr赶房展钟汉但家之这普intln("");

输出空格

Aab=ne厂雨wB();

声明为双火环施聚间单代类A但初始化为类B

因为编译器是从左向右进行的,所以先是Aab;

执行System.out.print("1");因为没有newA();

所以不执行类A的构造函数.那为什么会输出2呢?

是因为B类是继承A类的,所是在执行newB();

的时候,执行顺序是初始化Syst操厂可胜凯困扩师伤培em.out.print推责约派所管乱表切之("a");

然后先父类后子类,static代码只执行一次(已执行过);

执行System.out.print("2");

执行Syst载胡食em.out.pr第期差技int("b");

执行System.out.println("");

之后是ab=newB();A,B中的sta号省加顺北展一tic都已被执行过,

理那盾裂才革方所以只执行构造函数,因B类有父类A,所以先执行A类的构

造函数System.out.print("2");

再执行B类的构造函数

System.out.print("b");