class data
{
private static final data mInstance = new data();
private static int mx = 0;
private data()
{
System.out.println("mx=" + mx);
mx = getVersion();
}
public static data getInstance()
{
return mInstance;
}
public int getVersion()
{
int v = 0;
if (v == 0)
{
v = 7;
}
return v;
}
public int getmx()
{
return mx;
}
}
class Test2
{
public static void main(String args[])
{
System.out.println(data.getInstance().getmx());
}
}
为什么最后mx的值不是7?运行详细过程?如果把private static final data mInstance = new data();中的final去掉,能不能加上一个setInstance方法给mInstance赋一个值,用那个get方法输出?如果可以怎么写?如果不行,为什么? 作者: 薄炳鑫 时间: 2012-6-28 22:10 本帖最后由 薄炳鑫 于 2012-6-28 22:18 编辑
public class Test13 {
public static void main(String args[])
{
System.out.println(data.getVersion());//这儿也能证明返回的是7
//System.out.println(data.getInstance());
System.out.println(data.getInstance().getmx());//data.getInstance().getmx()这个方法
//先是执行了getInstance,再就是getmx()了,没实例化对象所以没掉用构造函数,就没执行private data(),getversion()等,所以return的是mx的初始值...
}
}
class data
{
private static final data mInstance = new data();
private static int mx = 0;
private data()
{
System.out.println("mx=" + mx);
mx = getVersion();
//System.out.println(mx);//这儿打印的也是7
}
public static data getInstance()
{
return mInstance;
}
public static int getVersion()//加个static用来证明是不是返回的是多少,主函数里调用这个方法..
{
int v = 0;
if (v == 0)
{
v = 7;
}
// System.out.println(v);//这儿打印的是7,也就证明返回的也就是7了,
return v;
}
public int getmx()
{
return mx;
}
}
如果没调用 构造函数怎么会执行构造函数中的语句System.out.println("mx=" + mx);呢? 作者: 孙飞 时间: 2012-6-29 00:04
想了半天我感觉是这样的,不知道对不?首先类加载的时候,运行第一句的初始化,new一个对象也就是private static final data mInstance = new data();这句。因为new了一个对象,所以构造函数运行,执行System.out.println("mx=" + mx);输出"mx"=0。然后构造函数中的mx = getVersion();调用下面的方法,返回了7.然后运行第二名 private static int mx = 0;又给mx赋值了0.所以最后输出的是0。
但如果是这样的话,静态初始化不是优先于构造函数执行吗?为什么第一句运行后不是运行第二个静态初始化,而是运行构造函数呢?不太明白
作者: 赵庆礼 时间: 2012-6-29 00:13
class data
{
private static final data mInstance = new data(); //去掉final之后也是不可以对mInstance赋值的
private static int mx = 0; //如果把static去掉会得到你想要的结果,参考截图:第二个执行结果为去掉static之后的情况
private data()
{
mx = getVersion(); //java编译时是逐行编译,当编译该行代码的时候getVersion()并没有返回值,mx还是默认的值0,所以打印的结果是0 。
//但是,在执行main函数的时候getVersion()函数会被执行,打印的结果为v=7,下图可以说明该情况。
System.out.println("data()中:mx = " + mx);
}
public static data getInstance()
{
return mInstance;
}
public int getVersion()
{
int v = 0;
if (v == 0)
{
v = 7;
}
System.out.println("执行时:v = "+v);
return v;
}
public int getmx()
{
return mx;
}
}
class TestDataDemo
{
public static void main(String args[])
{
System.out.println("main中:mx = "+data.getInstance().getmx());
}
}
如图