java吧 关注:1,243,788贴子:12,719,464
  • 18回复贴,共1

关于构造代码块,有个问题请教一下吧里各路大神

只看楼主收藏回复

public class MyTest {
int a = 3;
{
b = 5;
}
int b = 4;
@Test
public void test(){
System.out.println(b);//b=4;
}
}
这么写为什么是没有报错的呢?


IP属地:广东1楼2017-08-27 20:33回复
    int b = 4
    这一句应该是在b = 5之后执行的。
    为什么没有声明可以直接赋值呢?


    IP属地:广东2楼2017-08-27 20:34
    回复
      构造顺序是变量在初始化块之前。


      IP属地:浙江4楼2017-08-27 20:45
      收起回复
        编译完是这种效果的。从上到下执行。
        public class MyTest {
        int a = 0;
        int b = 0;
        MyTest(){
        a=3
        b = 5;
        b = 4;
        }
        @Test
        public void test(){
        System.out.println(b);//b=4;
        }
        }


        6楼2017-08-27 21:08
        收起回复

          如图


          IP属地:广东10楼2017-08-27 21:21
          收起回复
            java -verbose MyTest

            这个就是最开始的class字节码效果


            11楼2017-08-27 21:27
            收起回复
              public class MyTest {
              int a = 0;
              int b = 0;
              {
              a=3;
              b=5;
              b=4;
              System.out.println(b);
              }
              }
              这样写可以,编译器有古怪的扫描规则。


              12楼2017-08-27 21:33
              回复