黑马程序员技术交流社区

标题: 静态变量 [打印本页]

作者: 黄昆    时间: 2012-7-16 10:23
标题: 静态变量
public class Test{
         static double d=12.1234;
         static int i=f();
       
            
            public static void main(String[] args) {
                new Tes();
            }
            static int f(){
                System.out.println(d);
                return 3;
            }
        }
打印结果为:12.1234
public class Test{
         
         static int i=f();
         static double d=12.1234;
            
            public static void main(String[] args) {
                new Tes();
            }
            static int f(){
                System.out.println(d);
                return 3;
            }
        }
打印结果为:0.0
问题:为什么两个静态变量调换了一下位置,它的打印结果就不一样了呢?求解释
作者: 黑马振鹏    时间: 2012-7-16 11:00
public class Test{
         static double d=12.1234; //1
         static int i=f();//2
            public static void main(String[] args) {
                new Test();            }
            static int f()  //3
           {    System.out.println(d);
                return 3;
            }
        }

主函数中 new Tes();创建一个对象,因为定义的变量和方法都是静态的,所以都加载到内存中。按照顺序加载 ,1 ,2,3 static double d=12.1234会首先加载,这样执行到第二步的时候会调用3.打印结果就是
12.1234

第二种方式:
public class Test{
   
    static int i=f();
    static double d=12.1234;
      
       public static void main(String[] args) {
           new Test();
       }
       static int f(){
           System.out.println(d);
           return 3;
       }
   }
先执行这一句。static int i=f();  因为用到了方法f().所以直接调用
   static int f(){
                System.out.println(d);
                return 3;
            }
此时    static double d=12.1234; 并没有加载进来。System.out.println(d); 这个会打印d的默认值0.0


作者: 孙新强    时间: 2012-7-16 11:16
这个问题应该从编译和加载顺序的角度考虑:
在这个程序中,虽然成员变量和方法都是静态的,但是具体的加载顺序不一样。
在第一个程序中,程序在编译的时候,确认了,d是double 类型,i是int型,f()是int类型方法,在new Test()的时候加载时顺序加载,d—>i—>f(),这样打印出的结果就是12.1234
在第二个程序中,编译时,也都确认了各个变量和方法的类型均已确认,加载顺序是i—>f()—>d,这样打印出的结果就是0.0
作者: 黄昆    时间: 2012-7-16 11:18
孙新强 发表于 2012-7-16 11:16
这个问题应该从编译和加载顺序的角度考虑:
在这个程序中,虽然成员变量和方法都是静态的,但是具体的加载 ...

喔,看见熟人了,孙新强,我是黄昆呀! 你也要来黑马呀?
作者: 孙新强    时间: 2012-7-16 11:22
hkylp 发表于 2012-7-16 11:18
喔,看见熟人了,孙新强,我是黄昆呀! 你也要来黑马呀?

恩 准备的怎么样了

作者: 黄昆    时间: 2012-7-16 11:24
孙新强 发表于 2012-7-16 11:22
恩 准备的怎么样了

还行吧,我现在就在黑马宿舍住的呢
作者: 黄昆    时间: 2012-7-16 11:24
孙新强 发表于 2012-7-16 11:22
恩 准备的怎么样了

还行吧,我现在就在黑马宿舍住的呢
作者: 王宝康    时间: 2012-7-16 12:25
jeffreyno1 发表于 2012-7-16 11:20
这个问题主要考察了对象初始化的过程。

对象的初始化过程如下:

讲解的详细明了,:victory:




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2