美文网首页
静态变量一定要先声明后赋值

静态变量一定要先声明后赋值

作者: 秋名山车神_f776 | 来源:发表于2018-04-09 11:13 被阅读0次

这个标题是否像上一个建议的标题一样让人郁闷呢?什么叫做变量一定要先声明后赋值?Java中的变量不都是先声明后使用的吗?难道还能先使用后声明?能不能暂且不说,我们看一个例子,代码如下:

1 public class Client32 {

2 public static int i = 1;

3

4 static {

5 i = 100;

6 }

7 public static void main(String[] args) {

8 System.out.println(i);

9 }

10 }

这段程序很简单,输出100嘛,对,确实是100,我们稍稍修改一下,代码如下:

1 public class Client32 {

2 static {

3 i = 100;

4 }

5

6 public static int i = 1;

7

8 public static void main(String[] args) {

9 System.out.println(i);

10 }

11 }

注意变量i的声明和赋值调换了位置,现在的问题是:这段程序能否编译?如过可以编译,输出是多少?还要注意,这个变量i可是先使用(也就是赋值)后声明的。

答案是:可以编译,没有任何问题,输出结果为1。对,输出是1不是100.仅仅调换了位置,输出就变了,而且变量i还是先使用后声明的,难道颠倒了?

这要从静态变量的诞生说起,静态变量是类加载时被分配到数据区(Data Area)的,它在内存中只有一个拷贝,不会被分配多次,其后的所有赋值操作都是值改变,地址则保持不变。我们知道JVM初始化变量是先声明空间,然后再赋值,也就是说:在JVM中是分开执行的,等价于:

int i ; //分配空间

i = 100; //赋值

静态变量是在类初始化的时候首先被加载的,JVM会去查找类中所有的静态声明,然后分配空间,注意这时候只是完成了地址空间的分配,还没有赋值,之后JVM会根据类中静态赋值(包括静态类赋值和静态块赋值)的先后顺序来执行。对于程序来说,就是先声明了int类型的地址空间,并把地址传递给了i,然后按照类的先后顺序执行赋值操作,首先执行静态块中i = 100,接着执行i = 1,那最后的结果就是i =1了。

哦,如此而已,如果有多个静态块对i继续赋值呢?i当然还是等于1了,谁的位置最靠后谁有最终的决定权。

有些程序员喜欢把变量定义放到类最底部,如果这是实例变量还好说,没有任何问题,但如果是静态变量,而且还在静态块中赋值了,那这结果就和期望的不一样了,所以遵循Java通用的开发规范"变量先声明后赋值使用",是一个良好的编码风格。
public class Fish extends Animal {

 {
     System.out.println("普通语句块执行"); 
 }

 
  public void eat(){
        System.out.println("eat()"); 
        System.out.println(a);
    }
 
 static int a = 3;
 static{ 
       System.out.println("static语句块执行"); 
      int a = 4;//先声明是局部变量,否则变成全局变量
   } 

Fish(){
     System.out.println("构造执行"); 
}



public static void display(){  
             System.out.println("静态方法被执行");  
        }  

}

相关文章

  • 静态变量一定要先声明后赋值

    这个标题是否像上一个建议的标题一样让人郁闷呢?什么叫做变量一定要先声明后赋值?Java中的变量不都是先声明后使用的...

  • Java中变量的使用规则

    1、Java 中的变量需要先声明后使用 2、变量使用时,可以声明变量的同时进行初始化 , 也可以先声明后赋值 3、...

  • JavaScript变量的声明和使用

    变量是用来保存信息的容器。 变量的声明: JavaScript 使用关键字 var 来声明变量,可以先声明后赋值,...

  • ES6系列之变量的解构赋值

    本篇目录: 数组的解构赋值变量声明并赋值时的解构变量先声明后赋值时的解构不完全解构默认值交换变量解析一个从函数返回...

  • 【语法基础】Javas cript变量的声明和使用

    变量是用来保存信息的容器。 变量的声明 Javas cript使用关键字var来声明变量,可以先声明后赋值,也可以...

  • JAVA变量(二) 9.29

    Java变量使用规则 1.Java中变量需要先声明后使用。 2.变量使用时,可声明同时进行初始化,也可以先声明后赋...

  • JAVA与JS基础知识比对(一)

    js 变量 声明: var 变量名 赋值: 先声明,在赋值 声明之后直接赋值 以逗号隔开,给多个变量赋值 只声明,...

  • java 静态 new 对象

    一般情况下: Java中赋值顺序:父类的静态变量赋值自身的静态变量赋值父类成员变量赋值和父类块赋值父类构造函数赋值...

  • JS 变量 条件

    变量 声明变量同时赋值 var name='亚索';var number=20; 先声明变量再赋值 var nam...

  • C++教程(基本语法_查漏补缺)

    1.引用必须在声明时将其初始化,不能先声明后赋值。该引用就会一直指向该变量。 2.标准日志流(clog),打印错误...

网友评论

      本文标题:静态变量一定要先声明后赋值

      本文链接:https://www.haomeiwen.com/subject/jagbhftx.html