这是第一段:
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();
}}
这是第二段:
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
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();
}}
这是第二段:
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
Class.forName("org.cc.demo.JVMTest.Test");
那它(非静态变量赋值)是在 加载 连接 初始化的 哪个阶段或哪个中间阶段完成的?
你说的只留那个一样是主动使用和原来我用的没有区别的吧
类定义加载到 private static Test test=new Test(); 的时候,为了完成对test初始值设置,不得不执行new Test()。
第二段:ij为成员变量,所以在new时要进行初始化
不知道对不对,你可以把ij放到new前面试试看
对于静态变量i j的话是:
0.调用了Test类的静态方法
1.加载Test类
2.然后进行连接:
2.1.在准备的时候 将static变量进行初始化设为默认值 test=null; i=0; j=0;
2.2初始化的时候 从上向下执行 先private static Test test=new Test(); 然后打印出此时i j的值都为0
2.3轮到i j初始化i=4 j=5那么对于非静态的i j也就是第二个例子的
他的 i=4和j=5 是在以上哪一步之前的之间之后的?.......那个这个是我问题的本意...发帖没说明白 不好意思
2.2初始化的时候 从上向下执行 先private static Test test=new Test();
当然是这个时候,会初始化成员变量,再调用构造器。