当前位置: 首页 > 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 中关联引用的概念
  • 11111111
  • FineReport中如何实现自动滚屏效果
  • Otto开发初探——微服务依赖管理新利器
  • PHP的类修饰符与访问修饰符
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 百度小程序遇到的问题
  • 初识MongoDB分片
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 近期前端发展计划
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #前后端分离# 头条发布系统
  • (007)XHTML文档之标题——h1~h6
  • (C语言)字符分类函数
  • (附源码)php新闻发布平台 毕业设计 141646
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十六)一篇文章学会Java的常用API
  • (顺序)容器的好伴侣 --- 容器适配器
  • (推荐)叮当——中文语音对话机器人
  • (原)本想说脏话,奈何已放下
  • .gitattributes 文件
  • .NET 4.0中的泛型协变和反变
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 回调、接口回调、 委托
  • .net 设置默认首页
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @GetMapping和@RequestMapping的区别
  • @Service注解让spring找到你的Service bean
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [Android] Android ActivityManager
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [Django 0-1] Core.Handlers 模块
  • [EWS]查找 文件夹
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页