黑马程序员技术交流社区
标题:
请教大家关于静态的一个问题
[打印本页]
作者:
touch_world
时间:
2014-11-18 06:06
标题:
请教大家关于静态的一个问题
public class StaticTest {
private static StaticTest st1 = new StaticTest();
private static int a ;
private static int b = 0 ;
private int c ;
private int d = 0 ;
public StaticTest() {
super();
a ++ ;
b ++ ;
c ++ ;
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
public class StaticTest {
private static StaticTest st1 = new StaticTest();
private static int a ;
private static int b = 0 ;
private int c ;
private int d = 0 ;
public StaticTest() {
super();
a ++ ;
b ++ ;
c ++ ;
d ++ ;
System.out.println(st1.a);
System.out.println(st1.b);
}
public static void main(String[] args) {
System.out.println(st1.a);
System.out.println(st1.b);
System.out.println(st1.c);
System.out.println(st1.d);
System.out.println(StaticTest.a);
System.out.println(StaticTest.b);
}
复制代码
重新贴代码
作者:
小爷邱烙
时间:
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