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

yizhihongxing

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日

相关文章

  • 微信公众平台token验证失败的解决办法

    微信公众平台token验证失败的解决办法 微信公众平台开发是有许多开发者关注的一个领域。在开发的过程中,有时候会遇到token验证失败的情况。本文将介绍这个问题的常见原因及解决办法。 问题原因 在微信公众平台开发中,我们可以设置一个Token来进行对接。在每一次与微信服务器进行对接时,微信服务器都会将这个Token作为一个参数发送来进行验证,如果验证失败,就…

    其他 2023年3月29日
    00
  • 微信公众平台通用接口api指南

    以下是微信公众平台通用接口API指南的完整攻略,包含两个示例说明: 微信公众平台通用接口API概述 微信公众平台通用接口API是指微信公众平台提供的一组接口,用于开发者与微信公众平台进行交互。这些接口包括获取用户信息、发送消息、创建菜单、获取素材等功能。 微信公众平台通用接口API可以帮助开发者实现与微信公众平台的对接,实现自定义的业务逻辑和功能。 微信公众…

    other 2023年5月9日
    00
  • javascript每日必学之封装

    JavaScript每日必学之封装 封装是面向对象编程中的一个核心概念,也是 JavaScript 中一个非常重要的概念。封装可以帮助我们减少代码的重复,提高代码的可维护性和复用性。在本篇攻略中,我们将介绍封装的基本概念和实现方法。 什么是封装 封装是一种将数据和功能包装起来的技术,目的是隐藏对象内部的细节,只对外界暴露必要的接口,在一定程度上保证了代码的安…

    other 2023年6月25日
    00
  • centos下环境变量配置

    CentOS下环境变量配置攻略 在CentOS下配置环境变量是一项非常重要的任务,因为它可以使您的系统更加灵活和易于使用。本文将提供一些关于如何在CentOS下配置环境变量的详细说明,包括如何设置全局环境变量和用户环境变量。 设置全局环境变量 要设置全局环境变量,请按照以下步骤操作: 打开终端并以root用户身份登录。 打开/etc/profile文件: v…

    other 2023年5月9日
    00
  • window.onload的页面加载技巧

    当我们打开一个网页的时候,浏览器会依次加载 HTML、CSS、JavaScript等资源,而 window.onload 事件会在所有资源都加载完成后才会触发。所以通过 window.onload 来执行 JavaScript 操作可以保证页面中的所有元素都已经加载完成,从而避免因为元素还未加载完毕而出现错误的情况。 下面就是 window.onload 页…

    other 2023年6月25日
    00
  • 详解Golang 推荐的命名规范

    详解Golang 推荐的命名规范 在Golang中,有一套推荐的命名规范,这些规范有助于提高代码的可读性和可维护性。下面是一些常见的命名规范和示例说明: 1. 包名 包名应该是小写的,使用简洁而有意义的名称。 包名应该是单数形式,而不是复数形式。 示例: package main import \"fmt\" func main() { …

    other 2023年8月17日
    00
  • Android实现的ListView分组布局改进示例

    Android实现的ListView分组布局改进示例攻略 1. 概述 在Android开发中,ListView是常用的列表控件之一。当需要在ListView中实现分组布局时,可以通过改进布局和适配器来实现更好的用户体验。 2. 改进布局 为了实现ListView的分组布局,可以使用ExpandableListView控件。ExpandableListView…

    other 2023年8月25日
    00
  • python之mysqldb

    以下是详细讲解“Python之MySQLdb的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: Python之MySQLdb攻略 MySQLdb是Python中一个用于连接和操作MySQL数据库的模块。本攻略将介绍MySQLdb的安装和使用步骤。 步骤一:安装MySQLdb 可以使用以下命令在Ubuntu系统中安装MySQLdb: su…

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