Java常见笔试面试题目解析(三): Java中的静态变量的执行顺序

Java常见笔试面试题目解析(三): Java中的静态变量的执行顺序

public   class  StaticVariableTest {
    
private   static  StaticVariableTest svt  =   new  StaticVariableTest(); // 语句(1)
     private   static   int  count1; // 语句(2)
     private   static   int  count2  =   0 ; // 语句(3)
    
    
private  StaticVariableTest(){ // 语句(4)
        count1 ++ ;
        count2
++ ;
    }
    
public   static  StaticVariableTest getInstance(){ // 语句(5)
         return  svt;
    }
    
public   static   int  getCount1() {
        
return  count1;
    }
    
public   static   void  setCount1( int  count1) {
        StaticVariableTest.count1 
=  count1;
    }
    
public   static   int  getCount2() {
        
return  count2;
    }
    
public   static   void  setCount2( int  count2) {
        StaticVariableTest.count2 
=  count2;
    }
    
public   static   void  main(String[] args) {
        StaticVariableTest svt 
=  StaticVariableTest.getInstance(); // 语句(6)
        System.out.println( " count1: "   +  svt.getCount1()); // 语句(7)
        System.out.println( " count1: "   +  svt.getCount2()); // 语句(8)
    }
}
问题:当执行完语句(7)(8)时,打印结果分别是什么?为什么?
解答:当执行完语句(7)时,打印结果是1,当执行完语句(8)时,打印结果是0。分析:程序执行从main方法开始,首先执行语句(6),调用 getInstance方法,然而当它去调用这个方法的时候,它是一个静态的方法,在这个类里面定义了多个静态的成员变量。根据java初始化的顺序我们 知道,对于静态的内容肯定是先执行的,也就是说在执行getInstance方法之前,肯定先执行private static StaticVariableTest svt = new StaticVariableTest();而且它是从上到下分别执行静态的内容。换句话说,这个程序首先执行private static StaticVariableTest svt = new StaticVariableTest();而这里面又要调用一个构造方法StaticVariableTest(),则去执行这个构造方法 private StaticVariableTest(),执行这个构造方法时发现它里面的功能是将count1加1,将count2加1,而这个count1和 count2是我们定义的int类型的静态变量。根据java对成员变量的默认值,count1和count2初始化的时候都被设置为0,当执行完构造方 法后count1和 count2都等于1,这时StaticVariableTest这个对象就生成了,已经在内存里面存在了。接着赋给svt这个引用。那么svt这个引用 指向的StaticVariableTest类型的对象,它里面的count1是1,count2也是1。接着发现下面一行private static int count1;它是一个静态的,那么它要执行这行代码,这行代码只是一个声明,但是没有赋值,接着它就跳过这行不再赋值了(究其原因是因为count1已 经被赋值了,已经被加1了,也就是count1为1)。当我执行private static int count2 = 0;时发现count2也是一个静态变量,而且有一个显示的去赋值的这样一个动作。我们知道count2已经被赋值1了,但是这儿有一个显示的赋值的动 作,就把count2的值由1改变成了0。这个就是调用getInstance方法时程序的执行流程:语句(6)、语句(5)、语句(1)、语句(4)、 语句(2)、语句(3)

思考:如果将语句(2)和语句(3)放在语句(1)前面,当执行完语句(7)时,打印结果是1,当执行完语句(8)时,打印结果是1,想想是为什么?  

总结:静态变量的执行顺序是按照它们定义在类里面的先后顺序,按照从上到下来执行的。

你可能感兴趣的:(Java常见笔试面试题目解析(三): Java中的静态变量的执行顺序)