package Test;
public class Test {
private static Test tester = new Test(); // step 1
private static int count1; // step 2
private static int count2 = 333; // step 3
public Test() { // step 4
count1++;
count2++;
System.out.println(count1 + "\t" + count2);
}
public static Test getTester() { // step 5
return tester;
}
public static void main(String[] args) {
//Test.getTester();
}
}说明:
Test.getTester();这句话写和不写区别不大!
粗看这道题,感觉没什么,只是类加载顺序的问题。不过比较关键的一点是private static Test tester = new Test();
这段话把test这个对象给new出来了。牵一发而动全身,count1和count2也开始执行了。这就变得复杂些了。
一开始猜测运行答案:
1 334
程序的实际运行结果是:
1 1
好神奇的结果,想破脑袋都不太明白是怎么一回事。
最后查了下资料:
原来类加载的时候首先开辟了内存,然后赋予了默认的初始值。
也就是说count1和count2的内存首先被开辟出来了。
(具体是new Test()的时候开辟的,还是加载类的时候就开始开辟了,这需要再查下书!
我的看法是:在new对象的时候才开辟了类里面的count1和count2的内存
)
明白了这个过程,我们就能够理解为什么结果是1 1了,那是因为先执行的这句
private static Test tester = new Test(); // step 1
,然后走的构造方法,因为count1和count2内存已经被开辟出来了,所以count1++ 结果是1,count2++结果也是1
如果我们在main方法里面,再输出一下下面这句话
System.out.println(count1 + "\t" + count2);
发现结果是1 333。
分析过程:
程序执行完这句
private static Test tester = new Test();
就会走
private static int count1; // step 2
private static int count2 = 333; // step 3
发现count1没有赋值动作,就执行count2,于是count1还是1,而count2就变成333
分享到:
相关推荐
- 类的生命周期包括加载、验证、准备、初始化和卸载五个阶段。 - 双亲委派模型:类加载器在加载类时,会将任务委托给父类加载器,直到Bootstrap ClassLoader。 3. **内存区域**: - 程序计数器:记录当前线程...
1. **初始化**:首先,BeanBagger会连接到本地或远程的JMX服务器,这通常通过指定JMX服务URL完成。如果需要认证,还需要提供用户名和密码。 2. **MBean检索**:然后,BeanBagger会扫描可用的MBean服务器,列举出...
1. 初始化SmartUpload对象:在JSP页面中,首先创建SmartUpload实例,如`SmartUpload su = new SmartUpload();` 2. 开始上传:调用`su.initialize(request, response);`方法初始化上传环境,这里的request和response...
Genesis通常是指一个初始化或起源的概念,在IT领域,它可能特指某个软件、系统的启动器或者核心组件。在Windows平台上运行Genesis,意味着我们需要一套特定的环境或者工具集来确保软件的正常启动和运行。这就是X_...
例如,可以添加`OnCameraViewInitializedListener`来监听相机初始化完成,`OnPictureTakenListener`来处理拍照结果,`VideoRecorder.OnRecordingStartedListener`和`VideoRecorder.OnRecordingStoppedListener`来...