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了。
/*
面试题:
不需要运行代码,分析下面代码的执行顺序.
只在研究学术问题时会研究,在实际开发中几乎不会碰到
*/
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了。
相关文章推荐
- java面试题之try中含return语句时代码的执行顺序详解
- java面试题之try中含return语句时代码的执行顺序详解
- try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?【Java面试题】
- Java中创建对象时代码执行顺序
- Java面试题:有数组a[n],用java代码将数组元素顺序颠倒
- Java代码执行顺序总结
- java代码执行顺序
- Java中创建对象的时候代码执行顺序
- 【自动化测试】java测试代码里面的执行顺序
- Java面试题:有数组a[n],用java代码将数组元素顺序颠倒
- Java:类中代码的执行顺序
- [java起步]构造函数、构造代码快、静态代码块的执行顺序
- Java:类中代码的执行顺序
- java代码的执行顺序
- [疯狂Java]面向对象:初始化块、初始化代码、初始化顺序
- Java代码执行顺序
- Java中的继承与静态static等的执行先后顺序的面试题
- Java面试题:有数组a[n],用java代码将数组元素顺序颠倒
- Java基础-代码执行顺序(重要)
- 剑指Offer 面试题21:调整数组顺序使奇数位于偶数前面 Java代码实现