public class Singleton {
public static Singleton singleton=new Singleton();
public static int a;
public static int b=0;
public static int c=2;
private Singleton()
{
super();
a++;
b++;
c++;
}
public static Singleton getInstance()
{
return singleton;
}
public static void main(String [] args)
{
Singleton sl=Singleton.getInstance();
System.out.println("a="+sl.a);
System.out.println("b="+sl.b);
System.out.println("c="+sl.c);
}
}
找牛人解决以上一道题!在线等待回答
------解决方案--------------------
又是这个问题
要知道,定义和赋值是两个语句
int a = 0; 相当于 int a; a = 0;两条语句,int a是定义,用于分配内存,即方法栈生成的时候,在数据区的a的相对地址里留出一定的空间(int长度),作为a的内存空间,a = 0;是赋值语句,在语句被执行的时候的,往a的内存地址保存一个0,所以定义语句是在栈生成的时候就决定,赋值语句是在程序执行的时候决定的。而对于成员变量,int定义的时候,系统会自动初始化变量为0
//所以
public static Singleton singleton=new Singleton(); //此时a,b,c被定义,在栈中分配空间,然后出初始化为0,然后掉用构造方法,分别执行相应的赋值语句
public static int a;
public static int b=0; //然后 这里 相当于 int b; b=0; 即b=0语句被执行,所以b有重新变为0
public static int c=2; //同理,这里把c又变成2
------解决方案--------------------
看一下程序都干了些什么就清楚了呗。
PS:在下也是刚接触字节码不久,只能给点简单的说明:
第一种情况:
- Java code
class Test9 { public static Test9 singleton = new Test9(); public static int a; public static int b = 0; public static int c = 2; //public static Test9 singleton = new Test9();……}对应字节码:public class com.codetest.test.Test9 { public static com.codetest.test.Test9 singleton; public static int a; public static int b; public static int c; static {}; Code: 0: new #17 // class com/codetest/test/Test9 3: dup 4: invokespecial #18 // Method "<init>":()V // 这里应该是调用构造函数 7: putstatic #5 // Field singleton:Lcom/codetest/test/Test9; 10: iconst_0 11: putstatic #3 // Field b:I // 这里对应 b = 0 14: iconst_2 15: putstatic #4 // Field c:I // 这里对应 c = 2 18: return }