打字猴:1.700440908e+09
1700440908 编写高质量代码:改善Java程序的151个建议 [:1700438101]
1700440909 编写高质量代码:改善Java程序的151个建议 建议32:静态变量一定要先声明后赋值
1700440910
1700440911 这标题看着让人很纳闷,什么叫做变量一定要先声明后赋值?Java中的变量不都是先声明后使用的吗?难道还能先使用后声明?能不能暂且不说,我们先来看一个例子,代码如下:
1700440912
1700440913 public class Client{
1700440914
1700440915 public static int i=1;
1700440916
1700440917 static{
1700440918
1700440919 i=100;
1700440920
1700440921 }
1700440922
1700440923 public static void main(String[]args){
1700440924
1700440925 System.out.println(i);
1700440926
1700440927 }
1700440928
1700440929 }
1700440930
1700440931 这段程序很简单,输出100嘛!对,确实是100,我们再稍稍修改一下,代码如下:
1700440932
1700440933 public class Client{
1700440934
1700440935 static{
1700440936
1700440937 i=100;
1700440938
1700440939 }
1700440940
1700440941 public static int i=1;
1700440942
1700440943 public static void main(String[]args){
1700440944
1700440945 System.out.println(i);
1700440946
1700440947 }
1700440948
1700440949 }
1700440950
1700440951 注意,变量i的声明和赋值调换了位置,现在的问题是:这段程序能否编译?如果可以编译那输出是多少?还要注意:这个变量i可是先使用(也就是赋值)后声明的。
1700440952
1700440953 答案是:可以编译,没有任何问题,输出是1。对,你没有看错,输出确实是1,而不是100。仅仅调换了一下位置,输出就变了,而且变量i还真是先使用后声明的,难道这世界真的颠倒了?
1700440954
1700440955 这要从静态变量的诞生说起了,静态变量是类加载时被分配到数据区(Data Area)的,它在内存中只有一个拷贝,不会被分配多次,其后的所有赋值操作都是值改变,地址则保持不变。我们知道JVM初始化变量是先声明空间,然后再赋值的,也就是说:
1700440956
1700440957 int i=100;
[ 上一页 ]  [ :1.700440908e+09 ]  [ 下一页 ]