20180319 java java面向对象-面试题(代码执行顺序)
/*
面试题:
不需要运行代码,分析下面代码的执行顺序.
只在研究学术问题时会研究,在实际开发中几乎不会碰到
*/
public class App
{
private static App d = new App();
private SubClass t = newSubClass();
static
{
System.out.println(3);
}
public App()
{
System.out.println(4);
}
public static void main(String[] args)
{
System.out.println("hello");
}
}
//定义父类
class SuperClass
{
SuperClass()
{
System.out.println("构造SuperClass");
}
}
//定义子类
class Subclass extends SuperClass
{
static
{
System.out.println(1);
}
public SubClass()
{
//SuperClass();//有一个隐式的父类构造器
System.out.println(2);
}
}
以上代码块执行的结果是:
1
构造SuperClass
2
4
3
hello
解析:因为 public class App{...}代码依赖于private SubClass t = newSubClass();所以 class Subclass extends SuperClass
{...}的System.out.println(1);代码先加载带虚拟机中,即System.out.println(1)先执行,即先输出1的原因:
App类依赖于SubClass类,所以得先把SubClass类的字节码加载到JVM,先执行SubClass的代码块。
又因为非static字段的初始化其实都在构造器中,优先执行的,即
public class App
{
private static App d = new App();
private SubClass t = newSubClass();
static
{
System.out.println(3);
}
public App()
{
System.out.println(4);
}
public static void main(String[] args)
{
System.out.println("hello");
}
}
可以看成:
public class App
{
private static App d = new App();
private SubClass t = NULL;//
static
{
System.out.println(3);
}
public App()
{
t = new SubClass();
System.out.println(4);
}
public static void main(String[] args)
{
System.out.println("hello");
}
}
所以会先输出 2,再输出4
又因为Subclass是SuperClass的子类,所以先输出 构造SuperClass,再输出2。
又因为App类中其他的字节码都执行完了,就输出3了(即把代码块加载到虚拟机)。
最后执行加载虚拟机的操作,就输出hello了。