易截截图软件、单文件、免安装、纯绿色、仅160KB

由一道题来看java初始化顺序

今天看到一道题目,是这样的:(我在里面打印了一些语句,先注释掉了)
class Singleton {
private static Singleton obj= new Singleton();
public static int counter1;
public static int counter2 = 2;
private Singleton() {
counter1++;
counter2++;
// System.out.println("Singleton counter1:" + counter1);
// System.out.println("Singleton counter1:" + counter2);
}
public static Singleton getInstance() {
// System.out.println(obj.counter2 + obj.counter1);
return obj;
}
}
public class Test {
public static void main(String[] args) {
// System.out.println("Singleton.counter1:" + Singleton.counter1);
// System.out.println("Singleton.conuter2:" + Singleton.counter2);
// System.out.println("静态变量及构造函数已经初始化附值完毕");
Singleton obj =Singleton.getInstance();
System.out.println("obj.counter1==" + obj.counter1);
System.out.println("obj.counter2==" + obj.counter2);
}

打印的结果为1、2;
当然如果对初始化顺序很了解的人,会觉得这道题其实不咋的。。下面我给分析一下这道题吧
这时候把注释放开,打印结果如下:
Singleton   counter1:1
Singleton   counter1:1
Singleton.counter1:1
Singleton.conuter2:2
静态变量及构造函数已经初始化附值完毕
3
obj.counter1==1
obj.counter2==2
在得到实例化之前,程序先去运行它的static变量,也就是最上面的第一句话,由这句话把counter1和counter2的值变为1,一开始它们都默认为0,因为new出实例是在static int counter和static int counter2之前。。程序的执行是有顺序的,也就是变为1后,
public static int counter1;
public static int counter2 = 2;
这两步又对变量重新赋值,因此导致最后的结果是1、2。。
为了证实我的想法,可把private static Singleton obj= new Singleton();移到第二条去或者第三条去,出来的结果是不一样的。。
总结一下初始化的顺序:1、静态变量;2、静态初始化块,即用{},没有方法名无返回值;3、变量;4、初始化块;5、构造器。
静态变量的赋值有一定的先后顺序!


相关文档:

java入门

 Java学习从入门到精通 
一、 JDK (Java Development Kit) 
JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的J ......

Java操作XML文件 dom4j 篇【转】

在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互。
今天就来讲一下Java 中使用dom4j来操作XML文件。
我们需要引入的包:
//文件包
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
//工具包
import java.util.Itera ......

【Java App Convert to EXE File】

* ------------------------------------------------------------------------------------
Title:    TestJava.cpp
author: gloomy fish on 2009-09-16
------------------------------------------------------------------------------------ */
#include <windows.h>
#include <stdio.h& ......

JAVA排序汇总

package sort;

import java.util.Random;

/**
* 排序测试类
*
* 排序算法的分类如下: 1.插入排序(直接插入排序、折半插入排序、希尔排序); 2.交换排序(冒泡泡排序、快速排序);
* 3.选择排序(直接选择排序、堆排序); 4.归并排序; 5.基数排序。
*
* 关于排序方法的选择 ......

java数据类型转换

1如何将字串 String 转换成整数 int?
A. 有两个方法:
1). int i = Integer.parseInt([String]); 或
i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
注: 字串转成 Double, Float, Long 的方法大同小异.
2 如何将整数 int 转换成字串 String ?
A. 有叁种方法:
1.) ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号