当前位置: 首页 > news >正文

java中具有继承关系的类及其对象初始化顺序

先说结论
对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成员变量的赋值和实例代码块 -> 子类的构造函数。

实验代码如下:

public class ExtensionTest {

    public static void main(String[] args) {
        new SubClass();
    }
}

class SuperClass
{
    {
        System.out.println("我是父类实例块");
    }
    static {
        System.out.println("我是父类类构造块");
    }
    public SuperClass()
    {
        System.out.println("我是父类构造函数块");
    }
}
class SubClass extends SuperClass
{
    {
        System.out.println("我是子类实例块");
    }
    static {
        System.out.println("我是子类类构造块");
    }
    public SubClass()
    {
        System.out.println("我是子类构造函数块");
    }

}

结果:

我是父类类构造块
我是子类类构造块
我是父类实例块
我是父类构造函数块
我是子类实例块
我是子类构造函数块

解释:
类构造块是初始化类的时候执行的,而初始化类首先得加载类(不加载类进内存当然没法初始化)。
类实例块是放在该类构造函数最前面和父类构造函数之后执行的。因为子类的构造函数调用之前,会先调用父类的构造函数。

基于上述两条规则,我们再来看执行顺序。
new SubClass()也就是要构造SubClass这个类的一个对象,而要构造这个对象,首先必须把这个类的描述、定义加载进内存(类加载)。因此要先加载这个类(不过此时还未初始化)。
加载完这个类之后,想要构造这个类的对象。但是此时这个类的静态变量还未被初始化,因此要先初始化这个类,但是初始化这个类需要先初始化它的父类,因此此时就变成了,加载父类->初始化父类(调用静态块,即类构造块)
->初始化子类(调用静态块,即类构造块)。
然后就可以构造这个类的对象了,构造这个类的对象之前,要先构造父类对象,因此会先调用父类的构造函数,而调用父类构造函数之前又会先调用父类的实例块。
然后就到了子类构造函数,然而执行之前一样要先调用子类的实例块,最后才是子类的构造函数的函数体。

相关文章:

  • 和平之翼代码生成器SMEU版 4.0.0 Beta5 宝船公布
  • 去哪里学习行业知识?
  • java概述
  • Kubeadm证书过期问题修复方法之一:通过修改kubeadm源码
  • 区块链分支循环
  • java中【派生类、基类、父类、子类】
  • FydeOS VM for VMWare v6.0 Preview1 发布
  • 浏览器缓存机制
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • vue--为什么data属性必须是一个函数
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • 【翻译】babel对TC39装饰器草案的实现
  • Fabric架构演变之路
  • CSS实用技巧干货
  • Objective-C 中关联引用的概念
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Python实现BT种子转化为磁力链接【实战】
  • rc-form之最单纯情况
  • TCP拥塞控制
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端性能优化——回流与重绘
  • 数组的操作
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #14vue3生成表单并跳转到外部地址的方式
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (C++17) optional的使用
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 物件導向與老子思想 (OO)
  • (转)一些感悟
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Redis的秒杀Dome和异步执行
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • /3GB和/USERVA开关
  • @JsonFormat与@DateTimeFormat注解的使用
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [C++]类和对象(中)
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [emuch.net]MatrixComputations(7-12)
  • [Flex][问题笔记]TextArea滚动条问题
  • [FT]chatglm2微调
  • [LeetCode]--61. Rotate List
  • [leetcode]Flatten Binary Tree to Linked List