java中静态块,静态属性,方法的加载顺序
?
你一看会发现就是啊,name的值改变了啊,这说明代码的执行改变了啊!实际上:刚才说了执行,什么是执行,什么是编译看明白自己就明白了!说实话,笔者研究这个问题一下午时间,为什么这么长时间,因为也没注意到这个问题,所以一直在深究内核的运作.....!下面我们看看为什么会出现这种问题把,为什么name的值会改变,是执行的顺序改变了吗!? ?main方法中是什么,是不是只有打印语句,有没有操作上面的代码,没有把,其实是在不断的打印name这个静态对象的值
下面按前后顺序,分析谁在前,谁在后的执行结果 static { System.out.println("a静态块"); s = "我被编译了"; // 这里为什么不报错我们要理解Eclipse的编译顺序,从上到下依次编译,编译的时候就把所有的静态属性全部加载!
System.out.println(s);} // 这里你能获取到s吗? 系统会提示你,s还没有创创建,因为这里是第6行,你的对象在第8行才创建,编译不通过;
static String s = "你只是在打印我"; //这里才创建的String对象,按编译顺序s是多少?是不是变成了 "你只是在打印我"最终main函数中只是打印了s ,打印就是"你只是在打印我"
现在换位置: ?static String s = "你只是在打印我" ; //编译通过先创建了String类型的s; s是多少?是不是"你只 是在打印我"
static { s = "我被编译了" ; System.out.println(s); //Eclipse从上到下依次编译,,不是执行,是编译,编译到这,这里s是谁 ?是不是"我被编译了" }然后到这又把这个s直接打印了出来,打印结果肯定会变成,"我被编译了" !!
问题:有值就是执行过了吗????总结:因为main方法中都是打印语句,只是在-----打印编译后加载的值-----而已;打印不打印,name和s的值都在那里!注意不注意,name和s都是静态的!编译加载而已!
static String s = "静态String"; { System.out.println("静态String"+s); }static int a = 5; { s ?= "非静态int"; System.out.println("静态int变量"); }//还要注意的问题就是,在a中到底有没有给s赋值,很显然s的值此时未变,new的时候才执行到,为什么,请看下面的大总结!?
实际上,以上的所有问题加起来就得到的完整的答案,你如果看到了这里恭喜你,笔者费劲总结的最终的正确的结果就在下面:
先把内在的执行规律简述:
是不是比较复杂,光看特性就已经复杂了,这里有些的同学可能就会想了,那这两个的执行顺序是怎么样的呢,这里非常的迷惑人,因为各种情况你得到的测试结果可能都不一样
不过他们还是有顺序的,只不过分情况对待!
?
大补充:? ?