在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java静态代码块、构造代码块、构造方法的执行顺序

2017-2-7 13:38| 发布者: zhangjf| 查看: 447| 评论: 0

摘要: Java静态代码块、构造代码块、构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建 ...
Java静态代码块、构造代码块、构造方法的执行顺序

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。
执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步
1,super语句,可能出现以下三种情况:
1)构造方法体的第一行是this语句,则不会执行隐式三步,
2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,
3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;
2,初始化非静态变量
3,构造代码块
由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。
例如,分析下面的代码及执行结果,已经用注释标出了执行步骤Step 1–Step 7。
也就是说,当递归调用多个构造方法的时候,构造代码块只会在最后的(也即方法体第一行不是this语句的)那个构造方法执行之前执行!

  1. public class Test {
  2. public static int a = 0;
  3. static {// Step 1
  4. a = 10;
  5. System.out.println("静态代码块在执行a=" + a);
  6. }
  7. {// Step 4
  8. a = 8;
  9. System.out.println("非静态代码块(构造代码块)在执行a=" + a);
  10. }
  11. public Test() {
  12. this("调用带参构造方法1,a=" + a); // Step 2
  13. System.out.println("无参构造方法在执行a=" + a);// Step 7
  14. }
  15. public Test(String n) {
  16. this(n, "调用带参构造方法2,a=" + a); // Step 3
  17. System.out.println("带参构造方法1在执行a=" + a); // Step 6
  18. }
  19. public Test(String s1, String s2) {
  20. System.out.println(s1 + ";" + s2);// Step 5
  21. }
  22. public static void main(String[] args) {
  23. Test t = null;// JVM加载Test类,静态代码块执行
  24. System.out.println("下面new一个Test实例:");
  25. t = new Test();
  26. }
  27. }
复制代码

执行结果:

  1. 静态代码块在执行a=10
  2. 下面new一个Test实例:
  3. 非静态代码块(构造代码块)在执行a=8
  4. 调用带参构造方法1,a=10;调用带参构造方法2,a=10
  5. 带参构造方法1在执行a=8
  6. 无参构造方法在执行a=8
复制代码

http://bbs.csdn.net/topics/391001417

来自: http://blog.csdn.net//kingzone_2008/article/details/45015301

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 02:17

Copyright 2015-2025 djqfx

返回顶部