黑马程序员技术交流社区
标题:
一道关于代码块的面试题,求解,知道答案但不知道为什么
[打印本页]
作者:
我干阿衰
时间:
2015-5-9 13:10
标题:
一道关于代码块的面试题,求解,知道答案但不知道为什么
class ForDemo {
public static void main(String[] args) {
Zi z = new Zi();
}
}
class Fu {
static {
System.out.println("静态代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
{
System.out.println("构造代码块Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
{
System.out.println("构造代码块Zi");
}
}
作者:
yky1678
时间:
2015-5-9 14:11
1、因为创建对象必然要用到父类,所以首先加载Fu类,运行静态代码块,输出“静态代码块Fu”。
2、接着加载Zi类,运行Zi类的静态代码块,输出“静态代码块Zi”。
3、然后是Zi类的构造函数,但是Zi类的构造函数中默认的第一句是super(),所以跳到Fu类的构造函数,因为构造代码块优先于构造函数,所以执行Fu类的构造代码块,输出“构造代码块Fu”。
注意
:其实Fu类的构造函数的默认第一句还是super(),所以还得跑到Object执行一遍,因为没有输出语句,所以看不到在Object中执行了什么。Object中的代码执行完后才回到Fu类中去。
4、随后运行Fu类构造函数,输出“构造方法Fu”。
5、紧跟着Fu执行完后就执行Zi类的构造函数,但是Zi类有构造代码块,所以先执行Zi类的构造代码块,输出“构造代码块Zi”。
6、最后才是Zi类的构造函数中的输出语句,输出“构造方法Zi”。
静态代码块随着类的加载,而构造代码块是建立对象的时候加载的,所以先执行静态代码块,创建对象的时候再执行构造代码块,最后才轮到构造方法。
作者:
弯曲/mg抛物☀
时间:
2015-5-9 18:47
类加载的过程。http://www.jb51.net/article/47913.htm
作者:
弯曲/mg抛物☀
时间:
2015-5-9 18:56
创建一个类对象,类加载器会先加载这个类的父类。
作者:
gzp123
时间:
2015-5-9 21:48
先加载父类的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2