实例化子类时,父类与子类中的静态代码块、实例代码块、静态变量、实例变量、构造函数的执行顺序是怎样的?

代码执行的优先级为:

firest:静态部分

second:实例化过程

详细顺序为:

1.父类静态代码块与父类静态变量(取决于代码书写顺序)

2.子类静态代码块与子类静态变量(取决于代码书写顺序)

3.父类实例变量与父类代码块(取决于代码书写顺序)

4.父类构造函数

5.子类实例变量与父类代码块(取决于代码书写顺序)

6.子类构造函数

在JVM加载完类以后,类在被使用的时候初始化,静态部分只在类初始化的时候执行一次。

测试代码:

  1. class Father {
  2. Father() {
  3. LogUtil.log(System.currentTimeMillis() + " ------ 父类构造函数");
  4. }
  5. static {
  6. LogUtil.log(System.currentTimeMillis() + " ------ 父类静态代码块");
  7. }
  8. long x = getTime(" ------ 父类实例变量");
  9. {
  10. long time = System.currentTimeMillis();
  11. LogUtil.log(time + " ------ 父类代码块");
  12. }
  13. static long y = getTime(" ------ 父类静态变量");
  14. static long getTime(String who) {
  15. long time = System.currentTimeMillis();
  16. LogUtil.log(time + who);
  17. return time;
  18. }
  19. }
  20. class Child extends Father {
  21. Child() {
  22. LogUtil.log(System.currentTimeMillis() + " ------ 子类构造函数");
  23. }
  24. static long y = getTime(" ------ 子类静态变量");
  25. static {
  26. LogUtil.log(System.currentTimeMillis() + " ------ 子类静态代码块");
  27. }
  28. {
  29. long time = System.currentTimeMillis();
  30. LogUtil.log(time + " ------ 子类代码块");
  31. }
  32. long x = getTime(" ------ 子类实例变量");
  33. static long getTime(String who) {
  34. long time = System.currentTimeMillis();
  35. LogUtil.log(time + who);
  36. return time;
  37. }
  38. }

调用代码:

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. new Child();
  5. LogUtil.log("分隔符 ------ 分隔符");
  6. new Child();
  7. }
  8. }).start();

执行结果:

    1. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态代码块
    2. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态变量
    3. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类静态变量
    4. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类静态代码块
    5. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类实例变量
    6. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类代码块
    7. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类构造函数
    8. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类代码块
    9. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类实例变量
    10. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类构造函数
    11. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 分隔符 ------ 分隔符
    12. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类实例变量
    13. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类代码块
    14. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类构造函数
    15. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类代码块
    16. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类实例变量
    17. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类构造函数

Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序的更多相关文章

  1. Java静态代码块、代码块及构造函数执行顺序

    根据以下程序进行分析 定义一个父类 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我 ...

  2. C#构造函数、私有构造函数、静态构造函数与构造函数执行顺序

    默认构造函数,如果没有为类指定任何构造函数,编译器会自动为类创建一个无参构造函数,用以初始化类的字段:如果为类编写了构造函数,那么编译器就不会再自动生成无参构造函数了.ps.C#不允许用户为结构定义无 ...

  3. java怎么调用子类中父类被覆盖的方法

    public class b { { void show() { System.out.println("b"); } } public class c extends b { v ...

  4. Java父类与子类方法调用顺序

    父类 FatherClass package 父类与子类方法调用顺序; /** * 父类 * @author shundong * */ public class FatherClass { priv ...

  5. Java 父类和子类

    package chapter11; public class GeometricObject1 { private String color="white"; private b ...

  6. JAVA 父类与子类初始化顺序问题

    main方法-->子类对象的初始化语句(new className()语句)--->子类构造[因为继承的缘故,它先不会执行]--->父类构造[这一步先不会执行]--->父类静态 ...

  7. python的父类和子类中关于继承的不同版本的写法

    Python 2.7中的继承 在Python 2.7中,继承语法稍有不同,ElectricCar 类的定义类似于下面这样: class Car(object): def __init__(self, ...

  8. [Java] 父类和子类拥有同名的成员变量(fields)的情况

    首先,需要明确的是,无论是通过casting,还是通过将子类对象的reference赋值给父类变量,都无法改变该reference所指对象的真实类型.但当该reference的类型是父类时,将无法调用 ...

  9. java父类转子类的一个方法

    一般子类可以转父类.但父类转子类就会报cast error. 使用jsonobject 思想:先把父类转jsonstring 再把jsonstring转子类.剩余的子类值可以设定进去. import ...

随机推荐

  1. 设计模式之责任链模式 chainOfResp

    后面我们将学习设计模式里面的行为型模式 代码实现 /** * 抽象类 * @author bzhx * 2017年3月14日 */ public abstract class Leader { pro ...

  2. [译]为什么pandas有些命令用括号结尾,有些则没有?

    文章来源:https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/pandas.ipynb 方法:用括号调用 ...

  3. 【Luogu】P4462异或序列(莫队)

    题目链接 观察什么时候x到y之间那一段可以被统计 xorsum[x-1]^xorsum[y]=k xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k 莫队 ...

  4. HDU 5418 Victor and World(状压DP+Floyed预处理)

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

  5. SYZOJ 186 [额]你猜是不是DP(哈希+二分答案+二分搜索)

      题目描述 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 输入格式 两个字符串 输出格式 一个整数,为输入的两个字符串的最长公共连续子串的长度 测试样例 输入 qa ...

  6. Linux系统——常见的系统调用

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  7. 在react项目当中使用redux

    如果需要在你的react项目当中使用状态管理模式的话,需要引入redux和react-redux两个插件,redux提供基本的功能,react-redux提供将redux注入react的方法. imp ...

  8. ios工程中一天只让显示一次的广告,或是弹出窗,如何实现

    需求: 产品 代码实现: 在首页.m中 //一天之内只能批量邀请一次 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefault ...

  9. 教你怎么使用Windows7系统自带的备份与还原的方法

    原文发布时间为:2010-09-09 -- 来源于本人的百度文章 [由搬家工具导入] 继续单击“下一步”按钮,在其后界面中检查上述备份设置是否正确,如果不正确的话可以直接单击“取消”按钮,重新设置备份 ...

  10. 改变querystring值,然后重定向

    原文发布时间为:2009-11-13 -- 来源于本人的百度文章 [由搬家工具导入] 本页面改变querystring值,然后重定向 本页面,避免出现重复querystring。。 如避免出现 www ...