您的位置:首页 > 职场人生

java java面向对象-面试题(代码执行顺序)

2018-03-23 10:04 597 查看
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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: