继承中的初始化和加载

继承关系中的执行顺序代码

package onjava8.extend;

/**
 * 继承关系中的执行顺序
 */
class Insect {
    private int i = 9;
    protected int j;

    {
        System.out.println("Insect-构造代码块1执行");
    }
    static  {
        System.out.println("Insect-静态代码块1执行");
    }

    Insect() {
        System.out.println("i = " + i + ", j = " + j);
        j = 39;
    }

    {
        System.out.println("Insect-构造代码块2执行");
    }

    static  {
        System.out.println("Insect-静态代码块2执行");
    }

    private static int x1 = printInit("static Insect.x1 initialized");

    static int printInit(String s) {
        System.out.println(s);
        return 47;
    }
}

public class Beetle extends Insect {

    {
        System.out.println("Beetle-构造代码块1执行");
    }

    private int k = printInit("Beetle.k.initialized");

    static  {
        System.out.println("Beetle-静态代码块1执行");
    }

    public Beetle() {
        System.out.println("k = " + k);
        System.out.println("j = " + j);
    }

    {
        System.out.println("Beetle-构造代码块2执行");
    }

    static  {
        System.out.println("Beetle-静态代码块2执行");
    }
    private static int x2 = printInit("static Beetle.x2 initialized");
}

//测试主函数类
package onjava8.extend;
/**
 * @ClassName BeetleMain
 * @Description TODO
 * @Author fs
 * @Date 2021/12/16 22:22
 * @Version 1.0
 */
public class BeetleMain {
    public static void main(String[] args) {
        System.out.println("Beetle constructor");
        Beetle b = new Beetle();
    }
}

程序输出

Beetle constructor
Insect-静态代码块1执行
Insect-静态代码块2执行
static Insect.x1 initialized
Beetle-静态代码块1执行
Beetle-静态代码块2执行
static Beetle.x2 initialized
Insect-构造代码块1执行
Insect-构造代码块2执行
i = 9, j = 0
Beetle-构造代码块1执行
Beetle.k.initialized
Beetle-构造代码块2执行
k = 47
j = 39

在使用继承时,就相当于已经知道了基类的一切,并可以访问其中的任何public 和 protected成员

【1.加载基类静态成员及static块执行】

​ 在类的加载过程中,如果该类有基类,编译器会先加载该类的基类。(无论是否创建了基类的对象,基类也会被加载)

因此不会出现 C++中的 一个static 期望使用另一个static ,而另一个static还没被初始化,这就会出现问题

⬇️⬇️⬇️⬇️⬇️

然后基类的static初始化开始执行
【通过输出分析:】初始化X1为null,加载printInit方法,执行X1处的调用

【2.加载派生类静态成员及static块执行】

​ 再者是派生类的static

【3.基类普通成员及始化、从上到下、如果有构造代码块也就执行了】

【4.执行基类构造】

执行基类构造,其对象中的所有基本类型变量先被设置为默认值, 引用类型被设置为null,然后再执行出现在字段定义处的初始化动作(赋值)。

【5.派生类成员初始化、从上到下、如果有构造代码块也就执行了】

【6.执行派生类构造】

结论:Java继承关系中的初始化顺序如下:
父类静态成员、静态代码块 ➡️​ 子类静态成员静态成员、代码块 ➡️​ 父类成员变量和非静态块(顺序加载) ➡️​ 父类构造函数 ➡️​ 子类成员变量和非静态块(顺序加载) ➡️​ 子类构造函数​

Original: https://www.cnblogs.com/daydreamer-fs/p/16748012.html
Author: fogey
Title: 继承中的初始化和加载

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616900/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ApplicationContext refresh 过程及一些重要的 processor 解析

    注册 Bean 到容器,通过限定名获取 Bean 可以拦截 Bean 初始化前后的处理 可以在 Bean 属性注入后和即将销毁时做一些逻辑处理 解决了循环依赖 其实总结起来它实现的…

    Java 2023年6月5日
    078
  • 面向对象的JAVA

    一个类的结构: 属性==成员变量==field==域、字段 方法==成员方法==函数 类和对象的关系:类是一个统属概念,对象是独立的个体 public class ClassTes…

    Java 2023年6月15日
    059
  • 【设计模式】三种工厂模式

    【设计模式】工厂模式 相对来说,写的比较乱,但是看一下实例,其实理解很快 抽象工厂模式(这里主要介绍抽象工厂模式) 核心的工厂类不再负责所有对象的创建,而是将具体的创建工作交给子类…

    Java 2023年6月13日
    072
  • java 异常类与自定义异常

    目录 异常类 Exception 类的层次 throws/throw 关键字: throws: throw: try catch finally语句 声明自定义异常 异常类 在 J…

    Java 2023年6月9日
    0112
  • 接口回调与lambda表达式

    “接口回调”一词是借用了C语言中指针回调的术语,表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。 和类一样…

    Java 2023年6月14日
    093
  • 调试webpack

    调试webpack 1. 摘要 用过构建工具webpack的朋友应该都体会,面对其几百行的配置内容如大海一小舟,找不到边。看文档查百度,对其构建的生命周期看了又看。最终还是很茫然。…

    Java 2023年6月13日
    066
  • 使用cocoa捕获dock栏中的“退出”事件,解决qt开发的应用程序退出异常的问题

    最近在移植一个QT开发的应用程序到mac平台,由于我们的应用在退出时需要释放一些资源,不然在mac系统会报崩溃事件,但是当用户使用dock栏上面的退出功能时,没有捕获到这个退出事件…

    Java 2023年6月6日
    074
  • nacos、ribbon和feign的简明教程

    nacos简明教程 为什么需要nacos? 在微服务架构中,微服务之间经常要相互通信和调用,而且一个服务往往存在多个实例来降低负荷或保证高可用。我们假定A服务要调用B服务,最简单的…

    Java 2023年6月7日
    083
  • Windows系统安装最新版本RabbitMQ3.8.3报错解决

    今天想安装下RabbitMQ写几个用例看下,发现最新的安装包有些问题,不能直接安装使用,遇到一些问题,记录一下解决办法。 下载安装包 因为RabbitMQ是Erlang编写,安装时…

    Java 2023年6月5日
    096
  • Java-Security(三):加密的用法、PasswordEncoder类源码分析

    在第一篇文章,我们展示了一个demo,其中讲到了对用户的密码进行了明文展示的用法,其实那么做是不安全的,在实际项目中往往会采用各种加密方法(比如:bcrypt,md5,sha1,s…

    Java 2023年5月29日
    067
  • RabbitMQ客户端页面认识

    1.界面总览 2.用户管理 3.创建host 4.创建队列 5.MQ架构 6.RabbitMQ支持的模式 posted @2021-02-28 18:54 Mr_伍先生 阅读(38…

    Java 2023年5月30日
    076
  • Java中BeanUtils.copyProperties()用法和需要导入maven依赖

    1、导入的maven依赖包 <dependency> <groupId>commons-beanutilsgroupId> <artifactI…

    Java 2023年5月29日
    057
  • json2string json格式到string的转换,调试有时候可以用到

    是别人写的,好久已经忘记出处了,贴这有时候会再用到。 function json2string(strObject) {var c, i, l, s =”, v, p;…

    Java 2023年6月13日
    055
  • 深入MySQL(二):MySQL的数据类型

    对于MySQL中的数据类型的选择,不同的数据类型看起来可能是相同的效果,但是其实很多时候天差地别。本章从MySQL中的 常用类型出发,结合 类型选择的常见错误,贯彻MySQL的常用…

    Java 2023年6月7日
    0104
  • MyBatis-Plus修改数据,会不会把其他字段置为null

    前两天在用MyBatis-Plus写了一张单表的增删改查,在写到修改的时候,就突然蹦出一个奇怪的想法。 MyBatis-Plus的BaseMapper中有两个关于修改的方法。如下:…

    Java 2023年6月15日
    075
  • 匿名对象

    此时,匿名对象new phone赋值给了形参phone,在show方法内可以多次调用 匿名对象在java中可以充当return的值 匿名对象只可调用一次 如public class…

    Java 2023年6月15日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球