黑马程序员技术交流社区

标题: 求大神指教一个关于构造代码块的执行顺序问题。。。 [打印本页]

作者: SeaWind    时间: 2013-11-14 22:49
标题: 求大神指教一个关于构造代码块的执行顺序问题。。。
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是没有数据类型的吗?所以报错?

作者: 不抛弃不放弃    时间: 2013-11-14 23:02
恩 你想的没错  你的类在加载时  是先加载构造代码块里面的内容,  你的x没有数据类型 ,所以在编译时就会报错,这是语法错误
作者: FFF    时间: 2013-11-14 23:27
  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. }
复制代码

作者: spiderman    时间: 2013-11-15 10:43
类加载器先把类的class文件转换成字节码加载到内存中。
当你要使用该字节码生成对象,就会调用字节码里面的构造方法。
而在调用你选定的构造方法之前,会先执行构造代码块。
也就是说,在对象生成之前就要执行这个代码块。
如果像你这样写,这个对象还没有生成,i这个成员变量也没有加载到堆内存中,所以就找不到你构造代码块里面的i。
作者: 唐宋元明清    时间: 2013-11-15 15:56
spiderman 发表于 2013-11-15 10:43
类加载器先把类的class文件转换成字节码加载到内存中。
当你要使用该字节码生成对象,就会调用字节码里面的 ...

是么。。那么为什么把构造代码块中的print语句去掉,就可以正常编译执行呢?
作者: spiderman    时间: 2013-11-15 16:14
唐宋元明清 发表于 2013-11-15 15:56
是么。。那么为什么把构造代码块中的print语句去掉,就可以正常编译执行呢? ...

抱歉,刚才仔细看了上面两位的解释,不是对象生成与否的问题,而是变量定义早了的关系。。。谢谢哈,这也算解决了一个困扰了我很久的问题




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