黑马程序员技术交流社区
标题:
代码块问题
[打印本页]
作者:
左耳的鱼
时间:
2013-6-27 22:59
标题:
代码块问题
本帖最后由 左耳的鱼 于 2013-6-28 10:08 编辑
class Demo3 {
static{
System.out.println("静态代码块");
}
public static void main(String[] args) {
{
System.out.println("局部代码块");
}
Test t = new Test();
}
}
class Test{
{
System.out.println("第一个初始块" + this.x);
}
Test() {
System.out.println("x =" + x);
}
{
System.out.println("第二个初始块" + this.x);
}
int x = 7;
}
为什么执行结果x=7,x被赋值7不是在构造方法之后吗?执行顺序是怎样的?
作者:
傲鸽
时间:
2013-6-27 23:26
class Demo3 {
static{
System.out.println("静态代码块");//第一步
}
public static void main(String[] args) {
{
System.out.println("局部代码块");//第二步
}
Test t = new Test();
}
}
class Test{
{
System.out.println("第一个初始块" + this.x);//第三步
}
Test() {
System.out.println("x =" + x);//第六步
}
{
System.out.println("第二个初始块" + this.x);//第四步
}
int x = 7;//第五步
}
复制代码
最先执行的是静态代码块,因为静态代码块随着程序的加载而加载,第二步顺序执行局部代码块,然后调用了Test类的构造方法,而Test类中有构造代码块,构造代码块在构造方法前执行,需要注意的是Test类中的x是成员变量不是局部变量,初始化值为0,需要注意的是显示初始化和构造代码块的执行也是有顺序的,如果int x=7,在构造代码块的上面,就先进行显示初始化再执行构造代码块,
class Demo3 {
static{
System.out.println("静态代码块");//第一步
}
public static void main(String[] args) {
{
System.out.println("局部代码块");//第二步
}
Test t = new Test();
}
}
class Test{
int x = 7;//第三步
{
System.out.println("第一个初始块" + this.x);//第四步
}
Test() {
System.out.println("x =" + x);//第六步
}
{
System.out.println("第二个初始块" + this.x);//第五步
}
}
复制代码
结果是
静态代码块
局部代码块
第一个初始块7
第二个初始块7
x =7
复制代码
而此题中int x=7,在构造代码块的下面,所以要先执行构造代码块,再进行显示初始化,然后执行构造函数。
对于问题“为什么执行结果x=7,x被赋值7不是在构造方法之后吗?”,x是成员变量,成员变量赋初值都是在构造方法之前执行的
作者:
孙四有
时间:
2013-6-27 23:50
静态代码块随着类的加载而加载,执行1:静态代码快执行2:局部代码块然后new个对象,加载test,此时静态代码块的x默认是0,执行3:第一个厨师块。x=0.完了后就是构造代码块的加载,就是test().下面大括号内容执行4:第二个初始块x=0.最后成员x=7test()打印出x=7执行5:x=7
作者:
孙四有
时间:
2013-6-28 00:07
x=7,是成员变量。进入test()中,在这里,成员x的值就赋给了打印中的x。明白吗,你的是个空参数的构造函数。x=7这个是直接赋值的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2