当前位置: 代码迷 >> J2SE >> java所有程序员都可能犯异常的一道题!
  详细解决方案

java所有程序员都可能犯异常的一道题!

热度:93   发布时间:2016-04-24 01:46:51.0
java所有程序员都可能犯错误的一道题!!!
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        }
  相关解决方案