欢迎来到天天文库
浏览记录
ID:34707869
大小:57.49 KB
页数:3页
时间:2019-03-09
《java实例化对象时的执行顺序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题 * 几大原则 * 一、静态成员变量(Static) 1、静态成员变量为类变量,所有对象共享同一内存空间 2、静态成员变量的声明和定义仅在首次加载类时执行一次 3、首次加载类时首先对所有静态成员变量根据类型默认赋初值,然后再对有右值的附右值 *二、静态初始块 1、静态初始化块仅在首次加载类时执行一次 ······多个静态成员变量与静态始化快参照出现顺序先后执行······ * 三、动态成员变量 1、动态成员变量定义在每次实例化对象
2、时在构造函数之前执行 *四、动态初始化块 1、动态初始化块在每次实例化对象时在构造函数之前执行 ······多个动态成员变量与动态初始化块参照出现顺序先后执行······ * 总结:总的来说,在不涉及继承的前提下,当首次加载类时,按照如下顺序执行 * 1、按照出现顺序先后执行静态成员变量定义与静态初始化块 * 2、按照出现顺序先后执行动态成员变量定义与动态初始化块 * 3、执行构造函数 * 再次实例化对象时只执行第2、3步即可 * ············成员变量与定义与初始化块先于构造函数执行······
3、··· * 五、当涉及到继承时,按照如下顺序执行 1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块 2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法 3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法 * 另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法 如果一个类的成员变量没有在定义时,系统会给予系统默认的值,有=号的就直接给予右值,系统在给予初值和=号给予值这2中方式,在执行时间上有先后吗?1.pu
4、blic class Test04 ...{ 2. private static Test04 t1 = new Test04(); 3. private static int i1; 4. private static int i2 = 2; 5. 6. public Test04()...{ 7. i1++; 8. i2++; 9. } 10. 11. public static void main(String[] args) .
5、..{ 12. Test04 t2 = new Test04(); 13. System.out.println("t2.i1 = " + t2.i1); 14. System.out.println("t2.i2 = " + t2.i2); 15. } 16.} 17.执行代码后: 18.t2.i1 = 2 19.t2.i2 = 3 为什么是2和3呢?其实代码的执行顺序是这样的:首先执行给t1,i1,i2分别给予初始值null,0,0,再执行Test04t1=newT
6、est04(),这样i1++,i2++被执行,i1,i2都变为1,执行完毕后接着执行inti1;i1,i2的值仍然是1,1,当执行inti2=2时i2被赋予了值,即i1=1,i2=2;再执行Test04t2=newTest04(),i1,i2再执行++,此时i1=2,i2=3,输出i1,i2,结果就是:t2.i1=2,t2.i2=3。通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。
此文档下载收益归作者所有