黑马程序员技术交流社区

标题: 关于初始化块的问题 [打印本页]

作者: 贾振凯    时间: 2013-3-6 18:17
标题: 关于初始化块的问题
public class SubClass {
      int age = 2;           //先声明实例属性并初始化
      {
               age = 5;
               System.out.println(age);      //此处不需要this进行点取
      }
}



public class SubClass {
       {
               age = 5;    //此处怎样都OK
               System.out.println(this.age);      //此处需要this进行点取,为什么?
      }
          int age = 2;           //后声明实例属性并初始化
}

作者: scott0610    时间: 2013-3-6 19:25
Java的执行过程是从上往下依次执行。静态代码和属性其实质都会放在构造函数中执行。这个可使用javap -c   类名。来分解方法代码,也就是显示每个方法具体的字节码。这样就很容易明白。
作者: 张宁    时间: 2013-3-6 20:20
  1. public class SubClass {
  2.       int age = 2;           //先声明实例属性并初始化
  3.       {
  4.                age = 5;
  5.                System.out.println(age);      //此处不需要this进行点取
  6.       }
  7. }



  8. public class SubClass {
  9.        {
  10.                age = 5;    //此处怎样都OK
  11.                System.out.println(this.age);      //此处需要this进行点取,为什么?
  12.       }
  13.           int age = 2;           //后声明实例属性并初始化
  14. }
复制代码
类的成员变量在构造方法调用之前就已经初始化,因为代码的执行是从上往下,当执行到System.out.println(this.age);如果不加this,则视为age没有定义。加了this后相当于先调用构造方法,然后再调用它的age属性。此时就可以找到age了。你那个age=5那叫定义么?没有类型,执行这个肯定提示没定义么。定义必须加类型修饰。这个里面执行到system时就编译失败。此时它就找不到age的类型。它看不到后面的int age =2


作者: 移动小坦克    时间: 2013-3-6 21:27
上面都说是因为从下往上执行导致的,但是我个人认为
在new的时候先为所有的变量分配内存,其值是默认值,这个时候变量就都已经存在了。
然后按顺序执行块、初始化变量
从理论上来说,这种做法完全是没问题的,只是javac的一个限制
作者: amen0205    时间: 2013-3-6 22:56
在对象的初始化中,属性的默认初始化和显示初始化会先于  构造代码块执行,所以  例子1中可以执行成功,  例子2  我认为应也OK  还是坐等高手吧
作者: 贾振凯    时间: 2013-3-7 19:23
本帖最后由 贾振凯 于 2013-3-7 20:31 编辑
张宁 发表于 2013-3-6 20:20
类的成员变量在构造方法调用之前就已经初始化,因为代码的执行是从上往下,当执行到System.out.println(thi ...

不是在显示初始化之前就先分配内存并默认初始化了吗?
依稀记得
public class SubClass {
       {
                  age = 5;
                  System.out.println(this.age);
      }
       int age = 2;      
}
等同于
public class SubClass {
               int age;
               {
                  System.out.println(this.age);
               }
               public SubClass(){
                         age = 5;
                         age = 2;  
               }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2