public class demo {
public static demo instance = new demo(20); public static int i = 10; public static void main(String[] args) { demo d = demo.instance; demo d1 = new demo(20); } public demo() { } public demo(int a) System.out.println(a - i); }
}
![]() | 1 mjikop1231 2018-04-11 22:38:41 +08:00 代码块小了。。。? 先执行静态成员的定义 第一次调用 demo(20) ,此时 i=0 然后执行 main 第二次调用 demo(20),此时 i=10 所以输出是: ``` 20 10 ``` |
![]() | 2 shalk 2018-04-11 22:44:28 +08:00 via iPhone 静态初始化是按顺序赋值,instance 在赋值的时候,i 还是 0。这个 0 是准备阶段给出的 |
3 Wisteria 2018-04-11 22:50:43 +08:00 via Android 没格式化的代码看着真像一坨 |
![]() | 4 binbinyouliiii 2018-04-11 22:57:06 +08:00 ``` public class Demo { private static Demo instance = new Demo(20); private static int i = 10; public static void main(String[] args) { Demo demo1 = Demo.instance; Demo demo2 = new Demo(20); } public Demo(int a) { System.out.println(a - i); } } ``` |
![]() | 5 cs923 2018-04-11 23:28:44 +08:00 测试了下,输出如下: 20 10 ps:类被加载时从上到下初始化成员,int 属于基本类型未被初始化默认为 0 |
![]() | 6 WildCat 2018-04-11 23:54:50 +08:00 main method 的第一行: “ demo d = demo.instance;” 即使删掉(注释掉),也会输出 20。 跟调不调用没关系。 |
7 pwrliang 2018-04-12 00:07:30 +08:00 好题啊,我只知道 Class 在加载的时候会初始化 static 成员,但是不知道会按声明顺序初始化的。调换初始化顺序就变成了 10,10. public static int i = 10; public static demo instance = new demo(20); |
8 ng14 2018-05-24 17:39:19 +08:00 via Android 20 10 |
9 ng14 2018-05-24 17:40:08 +08:00 via Android java 类的准备阶段 |