黑马程序员技术交流社区

标题: 关于初始化过程问题 [打印本页]

作者: lzw123451    时间: 2013-3-2 13:24
标题: 关于初始化过程问题
  1. public class Test{
  2.     private static Test tester = new Test();
  3.     private static int count1;               
  4.     private static int count2 = 0;         
  5.     public Test(){                           
  6.         count1++;
  7.         count2++;
  8.         System.out.println("" + count1 + count2);
  9.     }
  10.     public static Test getTester(){         
  11.         return tester;
  12.     }
  13.    
  14.     public static void main(String[] args){
  15.        Test.getTester();
  16.        System.out.println(count1);    //这里为1
  17.        System.out.println(count2);    //这里为0  为什么这里是0不是1呢                                    
  18.     }
复制代码

作者: Gaara    时间: 2013-3-2 14:06
因为count1和count2都是静态的,所以类一进内存静态就开辟了方法区,此时count2已经有值了是0
它们是优先于对象存在的,而count1只是当构造函数给他赋值时才有的值。所以他是通过构造函数初始化的
所以他的只是1.  它们的初始化过程不一样,但都是优先于对象的。

希望能帮到你
作者: 杨剑    时间: 2013-3-2 15:23
执行过程:
首先会加载Test类,然后加载Test类中的静态属性和方法
所以加载Test类的时候首先加载tester属性,加载tester属性的时候对其进行显示初始化,此时
new Test();的地址被tester属性引用,并执行Test类的构造方法,count1和count2的值都变为1;
第二步加载静态的count1,因为count1是类所共享的,并且已经有值了,就不会给它进行赋值了,
count1的值仍为1;
第三步加载静态的count2,因为有这个语句count2=0;所以count2的值被显示初始化为0。所以count2
的值为0
作者: 张占忠    时间: 2013-3-2 15:39
其实,是那个++已经附上值了。 只是又被重新附上了新的值 0。
想搞明白这个题就要先明白,构造方法,是如何被加载的。
也就是构造方法的加载顺序。这个题主要是考这个。
通过方法,返回了属性值。而在得到这个属性的时候,
先初始化所有的属性参数值为null。
调用了构造函数,给属性赋值 count1=1 ,count2=1,
构造完了,tester 被原来的属性赋值。
count1 由于没有原来的属性,所以没有变。
而count2 又被原来的值所赋值,所以count2=0;

所以说count2不是没有++。是被0覆盖了。








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