返回信息流public class B extends A{
public static int b=print(6);
public int bb=print(7);
static{
print(8);
}
public B(String str)
{
super(str);
System.out.println(str);
}
public static int print(int i)
{
System.out.println(i);
return i;
}
public static void main(String args[])
{
B b=new B("winner");
}
}
class A{
public static int a =print(1);
public int aa=print(2);
static{
print(3);
}
{
print(4);
}
public A(String str)
{
System.out.println(5);
}
public static int print(int i)
{
System.out.println(i);
return i;
}
}
上面的输出结果是:13682457winner 执行顺序是程序运行时 会先加载父类中静态代码块 然后加载本身静态代码块,一旦创建对象(运用子类构造方法创建),就会调用 父类非静态代码块,父类构造方法,然后就是本身 非静态代码块,本身构造方法。那为什么执行子类的构造方法时调用了super(str),调用父类的构造方法,没有输出5 结构为什么不是136824575weinner
这是一条镜像帖。来源:北邮人论坛 / java / #53060同步于 2016/9/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求问一个java程序的输出结果
Rainydayfmb
2016/9/19镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
1. 首先是java类中的代码执行顺序:静态变量(静态代码块)->进入main方法->普通成员变量(类代码块)->构造方法。其中,静态变量或静态代码块按声明的先后顺序执行,普通成员变量或类代码块也按声明的先后顺序执行。下面的例子有清晰说明:
'''
2. 然后我们来看看java虚拟机的装载程序过程:
Java虚拟机首先装载父类,初始化父类中的静态变量或静态代码块: 输出1、3
然后装载子类,初始化子类的静态变量或静态代码块: 输出6、8
接着如上例所示,这时候要进入main方法,直到遇到new关键字,实例化子类;
实例化子类过程中,先调用super()实例化父类;
实例化父类过程中先初始化父类普通成员变量或类代码块: 输出2、4
然后执行父类构造方法 输出5
super()执行完毕后,按顺序实例化子类普通成员变量或类变量: 输出7
然后执行子类构造方法中的其他部分: 输出winnner
此时,new关键字实例化过程结束,接着执行main方法接下来部分。
'''
并不让人感到意外。这个文档描述了一切: http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.5
不错 出错
【 在 panshanwhut 的大作中提到: 】
: 1. 首先是java类中的代码执行顺序:静态变量(静态代码块)->进入main方法->普通成员变量(类代码块)->构造方法。其中,静态变量或静态代码块按声明的先后顺序执行,普通成员变量或类代码块也按声明的先后顺序执行。下面的例子有清晰说明:
:
: [upload=1][/upload]
: ...................