静态变量和非静态变量区别
这是第一段:
- Java code
package org.cc.demo.JVMTest;class Test{ private static Test test=new Test(); private static int i=5; private static int j=4; public Test(){ System.out.println(i); System.out.println(j); } public static Test getInstance(){ return test; }}public class JVMDemo01 { public static void main(String[] args) { Test t=Test.getInstance(); }}
这是第二段:
- Java code
package org.cc.demo.JVMTest;class Test{ private static Test test=new Test(); private int i=5; private int j=4; public Test(){ System.out.println(i); System.out.println(j); } public static Test getInstance(){ return test; }}public class JVMDemo01 { public static void main(String[] args) { Test t=Test.getInstance(); }}
按照JVM的加载 连接 初始化 可以知道第一段输出的是0 0
那么第二段的不是静态的 他是在什么完成i j的赋值的? 是在编译期还是什么时候? 打印出来5 4
[解决办法]
在你new他的时候 我感觉。。
[解决办法]
编译期可new不出来对象。当然是执行的时候,如1楼所说,new Test()的时候。
早期研究此类问题,可以增加大量的System.out.println();就比较容易了解情况了。
另外,你还可以试试在main里面只留下:
Class.forName("org.cc.demo.JVMTest.Test");
[解决办法]
new Test()时赋值滴
[解决办法]
new Test()时,调用构造器之前
[解决办法]
[解决办法]
[解决办法]
第一段:new在前,ij还没有进行初始化所以为0
第二段:ij为成员变量,所以在new时要进行初始化
不知道对不对,你可以把ij放到new前面试试看
[解决办法]
第二个:
2.2初始化的时候 从上向下执行 先private static Test test=new Test();
当然是这个时候,会初始化成员变量,再调用构造器。