java父类和子类初始化顺序的深入理解

下面我将详细讲解Java父类和子类初始化顺序的深入理解。

父类和子类初始化顺序的基本概念

在Java中,对象的初始化包括两部分:静态初始化和实例初始化。当类被加载时,它的静态成员会被初始化;当类的对象被创建时,会调用构造函数进行实例初始化。父类和子类的初始化顺序如下:

  1. 父类的静态成员初始化
  2. 子类的静态成员初始化
  3. 父类的实例成员初始化
  4. 父类的构造函数初始化
  5. 子类的实例成员初始化
  6. 子类的构造函数初始化

示例说明一

我们考虑下面的代码:

class A {
    static {
        System.out.println("A的静态代码块");
    }

    {
        System.out.println("A的实例代码块");
    }

    public A() {
        System.out.println("A的构造函数");
    }
}

class B extends A {
    static {
        System.out.println("B的静态代码块");
    }

    {
        System.out.println("B的实例代码块");
    }

    public B() {
        System.out.println("B的构造函数");
    }
}

public class Test {
    public static void main(String[] args) {
        new B();
    }
}

输出:

A的静态代码块
B的静态代码块
A的实例代码块
A的构造函数
B的实例代码块
B的构造函数

这样的输出结果是符合我们上面说的初始化顺序的。你可以看到,在对象实例化前,父类的静态变量会被初始化,然后是子类的静态变量初始化。接下来,父类的实例成员变量初始化,执行父类的构造函数;然后是子类的实例成员变量初始化和子类的构造函数。

示例说明二

下面再来一个例子,考虑子类是继承了父类的构造函数:

class A {
    public A() {
        System.out.println("A的构造函数");
        method();
    }

    public void method() {
        System.out.println("A的method方法");
    }
}

class B extends A {
    private int a = 1;

    public void method() {
        System.out.println("B的method方法,a = " + a);
    }

    public B() {
        System.out.println("B的构造函数");
    }
}

public class Test {
    public static void main(String[] args) {
        new B();
    }
}

输出:

A的构造函数
B的method方法,a = 0
B的构造函数

在这个例子中,我们可以看到,虽然在父类的构造函数中调用了method方法,但是由于这个方法被子类override了,在父类构造函数调用时,实际上是调用了子类的方法。由于子类的成员变量还没有被初始化,所以a的值为0。

这里提醒一下,最好不要在父类构造函数中调用被子类override的方法,否则可能会出现一些奇怪的结果,因为子类的成员变量还没有被初始化。这就是父类和子类初始化顺序的一个比较容易出错的地方。

以上是关于Java父类和子类初始化顺序的深入理解,以及两个实例讲解。希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java父类和子类初始化顺序的深入理解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • pip安装yaml

    以下是安装yaml模块的完整攻略,包括两个示例说明。 步骤 以下是安装yaml模块的基本步骤: 确认已安装pip。 在终端中输入pip –version如果输出pip的版本信息,则说明pip已安装。如果未安装,可以参考pip官方文档进行安装。 安装yaml模块。 在终端中输入pip install pyyaml,等待安装完成。 验证安装。 在终端中输入py…

    other 2023年5月6日
    00
  • Shell命令之数组表示语法学习

    Shell命令之数组表示语法学习 1. 数组的定义 数组是一种特殊的变量,它包含了多个元素,每个元素可以存储一个值。在Shell中定义数组的语法格式如下: 数组名=(元素1 元素2 ……) 其中,数组名是用户任意定义的名称,元素可以是数字、文本或其他Shell变量。定义数组时,元素之间用空格分隔。 例如,我们可以定义一个包含5个元素的数组: fruit=(&…

    other 2023年6月25日
    00
  • linux手工配置ip地址详细步骤

    Linux手工配置IP地址详细步骤 在Linux系统中,手工配置IP地址可以通过修改网络配置文件来实现。下面是详细的步骤: 打开终端,以管理员权限登录到Linux系统。 使用以下命令进入网络配置文件所在目录: cd /etc/sysconfig/network-scripts/ 列出该目录下的网络配置文件,找到需要配置的网络接口文件,一般以ifcfg-&lt…

    other 2023年7月30日
    00
  • Win2003 server 最大支持多少内存

    Win2003 Server 最大支持多少内存攻略 Windows Server 2003是一款老版本的服务器操作系统,其对内存的支持有一定限制。下面是详细的攻略,包括了两个示例说明。 1. 确定操作系统版本 首先,需要确定你所使用的Windows Server 2003的具体版本。Windows Server 2003有多个版本,包括Standard、En…

    other 2023年8月2日
    00
  • js中Array.sort()利用零值多维排序

    首先我们要知道,Array.sort()方法是按照Unicode码点对数组进行排序的,它的默认排序顺序是将元素转换为字符串,然后比较它们对应字符的Unicode码点值。 那么,在js中,我们可以利用Array.sort()方法实现多维排序,其具体操作步骤如下: 1.以排序维度为键名对数组进行排序 假设我们现在有一个二维数组,其中包含了商品的销售信息,如下: …

    other 2023年6月25日
    00
  • vuex的使用步骤

    下面是Vuex使用步骤的完整攻略。 安装Vuex 首先需要安装Vuex,可以通过npm安装,执行以下命令: npm install vuex –save 创建Vuex Store 在项目根目录下,创建一个store.js文件,并在其中引入Vuex: import Vue from ‘vue’ import Vuex from ‘vuex’ Vue.use(…

    other 2023年6月27日
    00
  • python基础学习笔记(一)python发展史与优缺点 岗位与薪资

    Python基础学习笔记(一):Python发展史与优缺点,岗位与薪资 Python是一种重要的编程语言,它已经成为了许多程序员的必备技能之一。本文将简要介绍Python的发展史、优缺点,以及使用Python所能够从事的岗位和相应的薪资水平。 Python的发展史 Python是由Guido van Rossum在1989年发明的,最初的目的是作为一种教育用…

    其他 2023年3月28日
    00
  • 探讨:使用httpClient在客户端与服务器端传输对象参数的详解

    下面是“探讨:使用httpClient在客户端与服务器端传输对象参数的详解”的完整攻略: 一、介绍httpClient传输对象参数的方法 httpClient是一款常用的HTTP客户端工具,常用于与服务器端进行数据交互。使用httpClient传输对象参数时,一般有两种方式: 1.将参数封装为JSON字符串,作为http请求的Body部分传递。 2.使用表单…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部