黑马程序员技术交流社区
标题:
关于初始化过程问题
[打印本页]
作者:
lzw123451
时间:
2013-3-2 13:24
标题:
关于初始化过程问题
public class Test{
private static Test tester = new Test();
private static int count1;
private static int count2 = 0;
public Test(){
count1++;
count2++;
System.out.println("" + count1 + count2);
}
public static Test getTester(){
return tester;
}
public static void main(String[] args){
Test.getTester();
System.out.println(count1); //这里为1
System.out.println(count2); //这里为0 为什么这里是0不是1呢
}
}
复制代码
作者:
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