A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾振凯 中级黑马   /  2013-3-6 18:17  /  1270 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;           //后声明实例属性并初始化
}

5 个回复

倒序浏览
Java的执行过程是从上往下依次执行。静态代码和属性其实质都会放在构造函数中执行。这个可使用javap -c   类名。来分解方法代码,也就是显示每个方法具体的字节码。这样就很容易明白。
回复 使用道具 举报
  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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
上面都说是因为从下往上执行导致的,但是我个人认为
在new的时候先为所有的变量分配内存,其值是默认值,这个时候变量就都已经存在了。
然后按顺序执行块、初始化变量
从理论上来说,这种做法完全是没问题的,只是javac的一个限制
回复 使用道具 举报
在对象的初始化中,属性的默认初始化和显示初始化会先于  构造代码块执行,所以  例子1中可以执行成功,  例子2  我认为应也OK  还是坐等高手吧
回复 使用道具 举报
本帖最后由 贾振凯 于 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;  
               }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马