Java关于含有继承类的成员初始化过程讲解

Java关于含有继承类的成员初始化过程讲解

在Java中,含有继承类的成员初始化过程比较复杂。本文将从以下几个方面详细讲解初始化过程:继承、实例化、构造函数和静态变量初始化。通过多个示例的说明,让读者更加深入地理解Java中含有继承类的成员初始化过程。

继承

在Java中,子类继承了父类的属性和方法,但是并不包括构造函数。因此,在实例化子类时,需要先实例化父类。这个过程称为构造函数链。构造函数链的执行顺序是从顶层父类开始,逐级向下执行,最后执行子类的构造函数。

实例化

实例化是指将类变量转化为真正意义上的实例。在实例化时,需要执行以下几个步骤:

  1. 分配内存空间,其中包括非静态变量和一些辅助信息,如虚函数表。
  2. 非静态变量初始化。变量的初始值由变量类型决定,引用类型的初始值为null。
  3. 执行构造函数。

构造函数

在执行构造函数时,需要执行以下几个步骤:

  1. 执行父类的构造函数。这个过程以构造函数链的方式逐级向下执行。
  2. 执行子类的构造函数。

需要注意的是,构造函数是不可继承的。如果子类没有定义构造函数,则默认使用父类的无参构造函数。

静态变量初始化

静态变量是类变量,在程序启动时就会被初始化。在含有继承类的情况下,静态变量的初始化顺序是从父类开始,逐级向下执行。

下面通过两个示例来说明含有继承类的成员初始化过程。

示例1

class A {
    static String s1 = "A's static variable";
    String s2 = "A's non-static variable";
    {
        System.out.println(s2);
    }
    public A() {
        System.out.println("Inside A's constructor");
    }
}
class B extends A {
    static String s1 = "B's static variable";
    String s2 = "B's non-static variable";
    {
        System.out.println(s2);
    }
    public B() {
        super();
        System.out.println("Inside B's constructor");
    }
}
public class C extends B {
    static String s1 = "C's static variable";
    String s2 = "C's non-static variable";
    {
        System.out.println(s2);
    }
    public C() {
        super();
        System.out.println("Inside C's constructor");
    }
    public static void main(String[] args) {
        C c = new C();
    }
}

输出结果:

A's non-static variable
A's non-static variable
Inside A's constructor
B's non-static variable
Inside B's constructor
C's non-static variable
Inside C's constructor

示例1说明了含有继承类的成员变量初始化和构造函数执行顺序。对于三个含有继承的类A、B和C,分别定义了静态变量s1和非静态变量s2,并且都有一个普通代码块。输出结果显示了变量初始化和构造函数执行过程中的信息。

示例2

public class A {
    static {
        System.out.println("A's static block");
    }
    {
        System.out.println("A's non-static block");
    }
    public A() {
        System.out.println("Inside A's constructor");
    }
}
public class B extends A {
    static {
        System.out.println("B's static block");
    }
    {
        System.out.println("B's non-static block");
    }
    public B() {
        super();
        System.out.println("Inside B's constructor");
    }
}
public class C extends B {
    static {
        System.out.println("C's static block");
    }
    {
        System.out.println("C's non-static block");
    }
    public C() {
        super();
        System.out.println("Inside C's constructor");
    }
    public static void main(String[] args) {
        C c = new C();
    }
}

输出结果:

A's static block
B's static block
C's static block
A's non-static block
Inside A's constructor
B's non-static block
Inside B's constructor
C's non-static block
Inside C's constructor

示例2说明了含有继承类的成员变量的静态代码块初始化过程。对于三个含有继承的类A、B和C,分别定义了静态代码块和普通代码块,输出结果显示了静态代码块和普通代码块初始化的顺序。需要注意的是,静态代码块只会被执行一次,而普通代码块会在每次实例化时都被执行。

总结

含有继承类的成员变量初始化和构造函数的执行顺序比较复杂,但是遵循一定的规则,可以让我们更好地理解和掌握。在编写含有继承类的代码时,需要注意变量初始化和构造函数执行顺序,以免出现意外的bug。同时,由于静态变量的初始化是在程序启动时就会完成,因此静态变量的初始化顺序也需要注意。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java关于含有继承类的成员初始化过程讲解 - Python技术站

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

相关文章

  • 解析Linux高性能网络IO和Reactor模型

    下面是针对“解析Linux高性能网络IO和Reactor模型”的完整攻略: 一、认识Linux高性能网络IO 1、IO模型 在Linux中,常用的IO模型有以下几种: 阻塞IO(Blocking IO):程序在读写数据的过程中会一直等待,直到数据从内核的缓冲区中复制到应用进程缓冲区并返回,才会继续执行下面的代码。 非阻塞IO(Non-blocking IO)…

    other 2023年6月27日
    00
  • 飞冰ice

    下面是关于“飞冰(Ice)”的完整攻略,包含两个示例说明。 简介 飞冰(Ice)是一种高效、灵活、跨平台的分布式对象通信框架,支持多种编程语言和平台。它提供了一种简单的方式来定义和使用分布式对象,并支持多种传输协议和编解码器。本文将介绍如何使用飞冰框架。 步骤一:安装飞冰 首先,需要安装飞冰框架。可以从官方网站下载适用于自己平台的安装包,并按照安装向导进行安…

    other 2023年5月8日
    00
  • 探讨各种PHP字符串函数的总结分析

    探讨各种 PHP 字符串函数的总结分析: PHP 字符串常用函数 strlen($string): 返回字符串的长度。 str_replace($search, $replace, $string): 查找指定字符并替换为另一个字符。 substr($string, $start, $length): 给定字符串的起始位置和长度,返回一段子字符串。 strp…

    other 2023年6月20日
    00
  • MyEclipse 10导入JDK1.7或1.8

    MyEclipse 10导入JDK1.7或1.8 MyEclipse是一款Java框架的开发工具,支持多种语言和技术,可以让Java开发者更轻松地开发应用程序。在使用MyEclipse进行开发时,需要导入相应版本的JDK,本文将介绍如何在MyEclipse 10中导入JDK1.7或1.8。 下载JDK安装包 首先需要从Oracle官网下载JDK1.7或1.8…

    其他 2023年3月28日
    00
  • 决战最宅2020 三款55寸电视大屏横向详细图文评测

    很抱歉,由于当前平台的限制,我无法以图文形式提供完整攻略。但是,我可以为您提供一份详细的文字攻略,包含两个示例说明。请参考以下内容: 55寸电视大屏横向详细图文评测攻略 1. 外观设计 电视A:采用超薄边框设计,给人一种高端大气的感觉。背面采用金属材质,提供良好的散热效果。 电视B:边框略厚,但采用金属材质,给人一种坚固耐用的感觉。背面设计简洁,接口布局合理…

    other 2023年10月18日
    00
  • PHP PDOStatement::fetchAll讲解

    接下来我会详细讲解”PHP PDOStatement::fetchAll讲解”的完整攻略。 1. 基础概念 1.1 PDO PDO是PHP的一种数据库抽象层,所有支持PDO的数据库都可以用同样的方式进行操作,不存在特别的语法,因此PDO是可移植的。PDO提供了面向对象的API,是PHP官方提供的轻量级数据库访问抽象层。 1.2 PDOStatement 在P…

    other 2023年6月27日
    00
  • 当li设置为line-block时,元素之间出现间隙的原因和解决方法

    当li设置为line-block时,元素之间出现间隙的原因和解决方法 在网页设计中,常常使用 list 标签来进行文本或图片列表的排版。为了使列表中的元素排列更加紧凑,有时候我们会将 li 元素的 display 属性设置成 line-block,但是,这样会导致 li 元素之间出现间隙的问题。接下来,我们将会详细的说明这个问题的原因和解决方法。 问题原因 …

    其他 2023年3月28日
    00
  • Win10更新四月正式版17134.166累积更新补丁 附更新内容和下载地址

    Win10更新四月正式版17134.166累积更新补丁攻略 本攻略将详细讲解Win10更新四月正式版17134.166累积更新补丁的安装过程,并提供更新内容和下载地址。请按照以下步骤进行操作: 步骤一:检查系统版本 首先,确保你的系统版本是Win10更新四月正式版17134.166。你可以通过以下步骤检查: 打开“设置”应用程序。 点击“系统”。 在左侧导航…

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