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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class A
{
    public static void mian(String[] args)
   {
      B b = new B();
   }
}
class B
{
   {
      x = 4;
     System.out.println(x);
   }
   int x = 1;
}


上面的代码报错:非法向前引用。
是因为在程序中  是先执行构造代码块么?  然后才加载int x   
所以构造代码块执行的时候x=4 中x是没有数据类型的吗?所以报错?

评分

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

查看全部评分

5 个回复

倒序浏览
恩 你想的没错  你的类在加载时  是先加载构造代码块里面的内容,  你的x没有数据类型 ,所以在编译时就会报错,这是语法错误
回复 使用道具 举报
FFF 金牌黑马 2013-11-14 23:27:52
藤椅
  1. class T
  2. {
  3.         T(){
  4.                 System.out.println(x+6);//在方法块里的代码执行后,才会执行构造代码。
  5.         }
  6.         int x = 1;//如果这里没有声明、下面就无法执行
  7.    {
  8.       x = 4;
  9.      System.out.println(x);//优先于构造代码执行。第一个就是执行这个块里的代码
  10.    }
  11.    //int x = 1;//如果放在这里,这个是最后才执行的。
  12. }
  13. public class temp001 {
  14.     public static void main(String[] args)
  15.    {
  16.       T t = new T();//初始化对象
  17.       //在YY李若亮老师讲这个讲得很清楚,你有空可以来听一听他的课。YY群号:88897091
  18.    }
  19. }
复制代码
回复 使用道具 举报 1 0
类加载器先把类的class文件转换成字节码加载到内存中。
当你要使用该字节码生成对象,就会调用字节码里面的构造方法。
而在调用你选定的构造方法之前,会先执行构造代码块。
也就是说,在对象生成之前就要执行这个代码块。
如果像你这样写,这个对象还没有生成,i这个成员变量也没有加载到堆内存中,所以就找不到你构造代码块里面的i。
回复 使用道具 举报
spiderman 发表于 2013-11-15 10:43
类加载器先把类的class文件转换成字节码加载到内存中。
当你要使用该字节码生成对象,就会调用字节码里面的 ...

是么。。那么为什么把构造代码块中的print语句去掉,就可以正常编译执行呢?
回复 使用道具 举报
唐宋元明清 发表于 2013-11-15 15:56
是么。。那么为什么把构造代码块中的print语句去掉,就可以正常编译执行呢? ...

抱歉,刚才仔细看了上面两位的解释,不是对象生成与否的问题,而是变量定义早了的关系。。。谢谢哈,这也算解决了一个困扰了我很久的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马