静态变量的编译过程

原创 2004年10月01日 21:30:00

  刚刚在看http://community.csdn.net/Expert/topic/2872/2872127.xml这个非常长但非常有意义的贴子,看到里面的一段关于讨论下面这段代码内容:
class Singleton {                                                        
                                               
  private static Singleton obj = new Singleton();                        
                                               
  public static int counter1;                                            
                                               
  public static int counter2 = 0;                                        
                                               
  private Singleton() {           
    //System.out.println("counter1:" + counter1 + "/n" + "counter2:" + counter2);                                       
                                               
    counter1++;                                                          
                                               
    counter2++;    
    //System.out.println("counter1:" + counter1 + "/n" + "counter2:" + counter2);                                                      
                                               
  }                                                                      
                                               
  public static Singleton getInstance() {                                
                                               
    return obj;                                                          
                                               
  }                                                                      
                                               
}


public class MyMain {                                                    
                                               
  public static void main(String[] args) {                               
                                               
    Singleton obj = Singleton.getInstance();                             
                                               
    System.out.println("obj.counter1=="+obj.counter1);                   
                                               
    System.out.println("obj.counter2=="+obj.counter2);                   
                                               
  }                                                                      
                                               
}

这时结果为:
obj.counter1==1
obj.counter2==0
去掉代码里面两条调试语句前的注释后结果为:
counter1:0
counter2:0
counter1:1
counter2:1
obj.counter1==1
obj.counter2==0
将程序改动一下,马上就会明白编译的顺序了:

class Singleton {                                                        
                                               
  private static Singleton obj = new Singleton();                        
                                               
  public static int counter1;                                            
                                               
  public static int counter2;//开始改动

  static {
    counter2 = 1;
  }                                  //改动结束
                                                
  private Singleton() {          
    System.out.println("counter1:" + counter1 + "/n" + "counter2:" + counter2);                                       
                                               
    counter1++;                                                          
                                               
    counter2++;    
    System.out.println("counter1:" + counter1 + "/n" + "counter2:" + counter2);                                                      
                                               
  }                                                                      
                                               
  public static Singleton getInstance() {                                
                                               
    return obj;                                                          
                                               
  }                                                                      
                                               
}


public class MyMain {                                                    
                                               
  public static void main(String[] args) {                               
                                               
    Singleton obj = Singleton.getInstance();                             
                                               
    System.out.println("obj.counter1=="+obj.counter1);                   
                                               
    System.out.println("obj.counter2=="+obj.counter2);                   
                                               
  }                                                                      
                                               
}
改动后结果为:
counter1:0
counter2:0
counter1:1
counter2:1
obj.counter1==1
obj.counter2==0

局部静态变量Static详解

在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直...
  • zkangaroo
  • zkangaroo
  • 2017年03月10日 18:01
  • 2308

常见Java面试题2

问题:什么是Java虚拟机?   答案:Java虚拟机是能移植到不同硬件平台上的软件系统。   问题:类型向下转换是什么?   答案:向下转换是指由一个通用类型转换成一个具体的类型,...
  • u012605629
  • u012605629
  • 2015年03月11日 21:24
  • 518

Java面试常见问题

1、问题:如果main方法被声明为private会怎样?答案:能正常编译,但运行的时候会提示”main方法不是public的”。2、问题:Java里的传引用和传值的区别是什么?答案:传引用是指传递的是...
  • tb176
  • tb176
  • 2016年07月28日 13:15
  • 872

静态变量 static

静态变量是一个非常重要的知识点,无论笔试面试,都是一个高频的考点!确实也十分重要,这里简单的总结一下,它C与C++中的作用!!以备后用! 变量的生命周期与作用域 静态变量属于静态存储方式,其存储空间为...
  • gogoky
  • gogoky
  • 2016年04月07日 11:30
  • 1268

static变量的初始化和赋值的区别

事实胜于雄辩,啥也别说,code说明问题: int add(int a, int b) { static int result = a + b; return result; } int _t...
  • petersmart123
  • petersmart123
  • 2016年08月30日 20:40
  • 11399

java基础---静态变量,成员变量,局部变量及类的初始化顺序

类变量(也叫静态变量):是类中独立于方法之外的变量,用static 修饰。(static表示“全局的”、“静态的”,用来修饰成员变量和成员方法,或静态代码块(静态代码块独立于类成员,jvm加载类时会执...
  • hla199106
  • hla199106
  • 2015年04月09日 20:52
  • 1774

浅析VB.NET局部静态变量————————【Badboy】

经过长时间学习VB.NET局部静态变量,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。VB.NET能够实现很多C#不能做到的功能,如When语句、Optional参数、局部S...
  • qq_19522245
  • qq_19522245
  • 2014年08月19日 08:57
  • 914

JAVA中序列化和反序列化中的静态成员问题

JAVA的序列化和反序列化中的静态成员问题     关于这个标题的内容是面试笔试中比较常见的考题,大家跟随我的博客一起来学习下这个过程。     JAVA中的序列化和反序列化主要用于: (...
  • dan15188387481
  • dan15188387481
  • 2015年11月22日 14:13
  • 2910

编译时连接与运行时链接及静态库链接

编译时连接与运行时链接的参考路径//动态库编译时链接 -L /lib /usr/lib /usr/local/lib 编译时链接的话,能查到libname.so 且这个文件要不是个link,要不就...
  • u011011827
  • u011011827
  • 2017年03月01日 22:34
  • 500

GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影...
  • benpaobagzb
  • benpaobagzb
  • 2016年05月10日 16:07
  • 6986
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:静态变量的编译过程
举报原因:
原因补充:

(最多只允许输入30个字)