黑马程序员技术交流社区
标题:
求大牛解释下面代码的运行过程
[打印本页]
作者:
showdy
时间:
2015-4-13 22:19
标题:
求大牛解释下面代码的运行过程
public class ExA
{
static ExA a = new ExA();
static
{
System.out.println("父类--静态代码块A");
}
Y b = new Y();
public ExA()
{
System.out.println("父类--构造函数B");
}
{
System.out.println("父类--非静态代码块C");
}
public static void main(String[] args)
{
System.out.println("父类--静态代码块S");
new ExB();
}
}
class Y
{
Y()
{
System.out.println("Y类无参");
}
}
class ExB extends ExA
{
private static ExB b = new ExB();
static
{
System.out.println("子类--静态代码块D");
}
{
System.out.println("子类--非静态代码块E");
}
public ExB()
{
System.out.println("子类--构造函数F");
}
Y y = new Y();
}
复制代码
作者:
耳东君
时间:
2015-4-13 23:30
public class ExA
{
static ExA a = new ExA();
static {
System.out.println("父类--静态代码块A");
}
Y b = new Y();
public ExA() {
System.out.println("父类--构造函数B");
}
{
System.out.println("父类--非静态代码块C");
}
public static void main(String[] args) {
System.out.println("父类--静态代码块S");
new ExB();
}
}
class Y{
Y(){
System.out.println("Y类无参");
}
}
class ExB extends ExA
{
private static ExB b = new ExB();
static{
System.out.println("子类--静态代码块D");
}
{
System.out.println("子类--非静态代码块E");
}
public ExB(){
System.out.println("子类--构造函数F");
}
Y y = new Y();
}
/*1.加载 class ExA:ExA里的静态static ExA a = new ExA()变量和静态代码块进方法区。
2.执行静态static ExA a = new ExA()变量,找到ExA的空参构造函数给变量Y b = new Y()初始化,打印"Y类无参"。
3.Y b = new Y()初始化完后 打印构造代码块中的 "父类--非静态代码块C"
4.打印ExA()空构造函数的"父类--构造函数B" static ExA a = new ExA();初始化完毕。
5.执行ExA类中的静态代码块"父类--静态代码块A",此时class ExA中的静态static ExA a = new ExA()变量和
静态代码块执行完毕。
6.执行主函数下的打印语句"父类--静态代码块S"。
7.new ExB();加载class ExB,ExB里的静态private static ExB b = new ExB()变量和静态代码块进方法区。
8.执行静态private static ExB b = new ExB()变量,找到ExB的空参数构造函,通过里面的super调用了父类的
无参构造函数又执行了变量Y b = new Y(); 打印"Y类无参"。
9.打印构造代码块"父类--非静态代码块C"
10.打印构造函数"父类--构造函数B"
11.super调用完父类的无参构造后执行ExB的构造代码块打印"子类--非静态代码块E".
12.再执行成员变量Y y = new Y();打印"Y类无参"
13.打印"子类--构造函数F"
14.此时执行完private static ExB b = new ExB();
15.执行ExB中的静态代码块"子类--静态代码块D"
16.现在ExB中的静态private static ExB b = new ExB()变量和静态代码块执行完毕
17.继续完成主函数new ExB()未完成的动作找到ExB()无参构造函数,通过super到父类的ExA无参构造函数
18.又执行了Y b = new Y(); 打印了"Y类无参"
19.打印"父类--非静态代码块C"
20.打印"父类--构造函数B"
21.回到子类 打印ExB的构造代码块"子类--非静态代码块E"
22.执行成员变量Y y = new Y();打印"Y类无参"
23.打印ExB构造函数的"子类--构造函数F"
为什么在主函数new ExB()的过程中先执行了ExB的构造代码块后再执行成员变量Y y = new Y()?
通过下面代码体现:
class Fu{
//Y y = new Y();
{
System.out.println("fu");
}
//Y y = new Y();
public Fu(){
}
//Y y = new Y();
public static void main(String[] args) {
Zi z = new Zi(1);
}
}
class Zi extends Fu {
public Zi(int i){
System.out.println("zi"+i);}
}
class Y {
Y(){
System.out.println("11111");
}
}
*/
复制代码
作者:
showdy
时间:
2015-4-13 23:31
楼上大神啊。。。。。{:3_53:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2