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

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了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值