黑马程序员技术交流社区

标题: 一段代码 [打印本页]

作者: 杨志罡    时间: 2011-8-7 22:41
标题: 一段代码
[code=java]package com.yang.test1;

public class MyTest {

        public static void main(String[] args) {
                Singleton singleton = Singleton.getInstance();
               
                System.out.println(singleton.counter1);
               
                System.out.println(singleton.counter2);
        }
       
}
class Singleton{
       
       
        //情况1private static Singleton singleton = new Singleton();
        public  static int counter1;
       
        public  static int counter2 = 0;
        //情况2private static Singleton singleton = new Singleton();
         //打开其中一种情况运行
        private Singleton() {
                counter1++;
                counter2++;
        }
       
        public static Singleton getInstance() {
                return singleton;
        }
}[/code]
作者: 匿名    时间: 2011-8-8 01:04
我就说一下我debug的情况//情况1private static Singleton singleton = new Singleton();
main方法开始执行Singleton singleton = Singleton.getInstance(); 的时候就开始加载Singleton这个类static修饰的字段和方法都开始产生了 此时new Singleton(); count1=1 count2=1,然后执行静态public  static int counter1; 因为有值了就不用初始化,然后执行public  static int counter2 = 0; 就将count2=0
//情况2private static Singleton singleton = new Singleton(); 一加载这个类的时候先public  static int counter1; public  static int counter2 = 0;  此时count1 和count2都为0  然后就执private static Singleton singleton = new Singleton(); 对其自增   就全部为1
主要是static先后顺序的问题public   int counter1 ;public  int counter2 = 0;你去掉static不管private static Singleton singleton = new Singleton(); 在哪都是执行了一次
你在构造方法中添加了这句话System.out.println("counter1="+counter1+",counter2="+counter2);会发现有他们都曾经为1过
作者: 匿名    时间: 2011-8-8 02:07
无论有多少个实例对象,首先是静态代码块,静态变量被执行且被执行一次,然后是自段,然后是父类构造方法,再到自己构造方法
作者: 匿名    时间: 2011-8-9 22:39
这么精辟的问题 怎么不给楼主加分




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2