黑马程序员技术交流社区

标题: 请教大家关于静态的一个问题 [打印本页]

作者: touch_world    时间: 2014-11-18 06:06
标题: 请教大家关于静态的一个问题
  1. public class StaticTest {
  2.     private static StaticTest st1 = new StaticTest();
  3.     private static int a ;
  4.     private static int b = 0 ;
  5.     private int c ;
  6.     private int d = 0 ;
  7.     public StaticTest() {
  8.         super();
  9.         a ++ ;
  10.         b ++ ;
  11.         c ++ ;
  12.         d ++ ;
复制代码
结果是 11 1011
这段代码无意中看到,觉得对我们理解静态很有帮助,首先看第一静态就创建了了一个本类对象 new StaticTest()
然后就会调用构造函数,然后构造函数去初始化成员变量a,b,c,d,然后进行加1的动作,a,b,c,d的值都是1,1,1,1
然后 ,往后读静态,a没有赋值,b重新赋值0,于是成为了 abcd 1011,然后查阅StaticTest.a和StaticTest.b为1,0
说明了StaticTest静态单独就是一个类,新建立了对象后即便用st.a和st.b仍然指向StaticTest.a和StaticTest.b
希望大神能指导下是不是这样的?


作者: touch_world    时间: 2014-11-18 06:08
  1. public class StaticTest {
  2.     private static StaticTest st1 = new StaticTest();
  3.     private static int a ;
  4.     private static int b = 0 ;
  5.     private int c ;
  6.     private int d = 0 ;
  7.     public StaticTest() {
  8.         super();
  9.         a ++ ;
  10.         b ++ ;
  11.         c ++ ;
  12.         d ++ ;
  13.         System.out.println(st1.a);
  14.         System.out.println(st1.b);
  15.         
  16.     }
  17.     public static void main(String[] args) {
  18.         System.out.println(st1.a);
  19.         System.out.println(st1.b);
  20.         System.out.println(st1.c);
  21.         System.out.println(st1.d);
  22.         System.out.println(StaticTest.a);
  23.         System.out.println(StaticTest.b);
  24.          
  25.     }
复制代码


重新贴代码
作者: 小爷邱烙    时间: 2014-11-18 08:38
debug一下可以发现,private static StaticTest st1 = new StaticTest();时执行了一下构造函数,abcd值都为一,之后执行private static int b = 0 ;,又把b改变为0,此后由于st1已经指向对象,不再创建新的对象,所以不执行构造函数,1011的值不会在改变,这就产生了结果

你的理解都是对的
作者: 奋斗的蜗牛ksd    时间: 2014-11-18 13:02
有一个明显的错误哦
private static StaticTest st1 = new StaticTest();
加载类的时候,加载静态对象---加载 构造函数,这里你都是对的,
可是加载构造函数的时候 就会出现明显的错误,因为c不是静态的,c不会赋值的
所以 第一次执行构造函数的时候 结果是 1 1 报错  0,c是不会赋值的!
作者: 奋斗的蜗牛ksd    时间: 2014-11-18 13:04
如果你在构造函数里面 写上输出  语句 输出c  d  就会看见 java.lang.ExceptionInInitializerError,空指针异常,而行数一定会指向 c的输出语句的,因为执行不到这句,自动抛出异常了!

作者: 奋斗的蜗牛ksd    时间: 2014-11-18 13:23
如果你只是为了验证 静态成员变量 a和b第一次随着类对加载变成 1 1 ,第二次b加载 0覆盖1的话,这里是对的,我说的错 是c ,c刚开始不会加载  执行++的。这时静态和非静态的区别。




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