首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java中关于实例成员变量,静态成员变量,静态代码块 的有关问题。很是迷茫

2012-03-19 
java中关于实例成员变量,静态成员变量,静态代码块 的问题。很是迷茫!如果一个类中有 实例成员变量,静态成员

java中关于实例成员变量,静态成员变量,静态代码块 的问题。很是迷茫!
如果一个类中有 实例成员变量,静态成员变量,静态代码块 ,他们是如何被加载后被初始化或执行的?
我最初的想法是:类被加载时,只有 静态成员变量被构造和静态代码块被执行,而实例成员变量是不会被构造的;
结果却不是,下面是代码: 

Java code
package com.wind.jdbc;public class TestStaticCode {    private static TestStaticCode tsc = new TestStaticCode();    static{        System.out.println("4");    }    private InstanceVariable iv = new InstanceVariable();        private TestStaticCode(){        System.out.println("3");    }    public static void main(String[] args){        }}package com.wind.jdbc;public class InstanceVariable {    static{        System.out.println("1");    }    public InstanceVariable(){        System.out.println("2");    }}


结果竟然是:
1
2
3
4
很是不解,,求指教!

[解决办法]
你 new TestStaticCode();之后 ,filed域肯定要初始化的。即 private InstanceVariable iv = new InstanceVariable();
[解决办法]
其实很容易理解的,都是这句引发的血案:
private static TestStaticCode tsc = new TestStaticCode();
根据对象初始化顺序,那么肯定要先执行这个了,
他发现需要构造一个TestStaticCode,那么自然会去调用构造函数,但是构造的时候他发现内部有个InstanceVariable还没初始化,所以他必须要先初始化InstanceVariable这个对象,jvm就会先初始化InstanceVariable了。所以打印出1,2。后面的3,4也就好理解了。
[解决办法]
Java code
private static TestStaticCode tsc = new TestStaticCode(); --1    static{ --2        System.out.println("4");    }同样的static级别,会按顺序执行,所以先执行 --1 后执行 --2执行 --1的时候,应为 new TestStaticCode(); 会生成 TestStaticCode实例,所以会先调用 TestStaticCode的初始化块代码,然后再调用构造方法private InstanceVariable iv = new InstanceVariable();这条语句相当于2条语句private InstanceVariable iv;{iv = new InstanceVariable();} //这个就是初始化块代码,优先于构造方法其他的就不用说明了,static{}静态块在类加载的时候被调用,{}非静态初始化块在实例对象被初始化构造方法被调用之前被调用举个例子,LZ理解好这个例子就能理解你的代码了public class Test {    public Test() {        System.out.println("我是构造方法9");  //构造方法在对象实例化时非静态初始化块执行结束以后被执行        System.out.println("我是构造方法10"); //同级别的安先后顺序执行    }    {System.out.println("我是非静态初始化块5");} //非静态初始化块在对象实例化时构造方法被调用之前被执行    {System.out.println("我是非静态初始化块6");} //同级别的按先后顺序执行    String str2 = "我是静态代码块7";    {        System.out.println(str2);        str2 = "我是静态代码块8"; //这里重新赋值        System.out.println(str2); //可见 String str2=xxx 相当于                                  //String str; {str=xxx;}//在非静态初始化块赋值                                  //非静态初始化块同级别按先后顺序执行    }    static {System.out.println("我是静态代码块1");} //静态块在类加载的时候被执行    static {System.out.println("我是静态代码块2");} //同级别的按先后顺序执行    static String str = "我是静态代码块3";    static {        System.out.println(str);        str = "我是静态代码块4"; //这里重新赋值        System.out.println(str); //可见 static String str=xxx 相当于                                  //static String str; static {str=xxx;}//在静态块赋值                              //静态块同级别按先后顺序执行    }    public static void main(String[] args) {        new Test(); //LZ自己理解一下例子的执行顺序    }} 

热点排行