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。同时,由于静态变量的初始化是在程序启动时就会完成,因此静态变量的初始化顺序也需要注意。

阅读剩余 69%

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

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

相关文章

  • Android 自定义ListView示例详解

    让我来为您讲解一下“Android 自定义ListView示例详解”的完整攻略。 概述 ListView是Android开发中经常使用的一个View,它可以展示一系列的数据。但是默认的ListView在某些情况下不足以满足我们的需求,例如希望可以对ListView的item进行自定义布局,添加一些交互事件等。此时我们就需要自定义ListView了。本文将详细…

    other 2023年6月25日
    00
  • Android Studio里如何使用lambda表达式

    下面是详细的攻略。 什么是Lambda表达式 Lambda表达式是Java8中引入的一个新特性,它可以让开发人员更方便的编写函数式接口的实现。Lambda表达式的基本形式为:(parameter) -> expression or statement 这个语法中,parameter表示函数接口的参数列表,->是Java8中新定义的操作符,可以将参…

    other 2023年6月27日
    00
  • Linux内核宏Container_Of的详细解释

    Linux内核宏Container_Of的详细解释 Container_Of是一个在Linux内核源码中广泛使用的宏,它的作用是根据某个结构体成员的指针推导出该结构体的指针。该宏的定义如下: #define container_of(ptr, type, member) \ ({ \ const typeof( ((type *)0)->member …

    other 2023年6月27日
    00
  • wpf界面设计技巧(2)—自定义漂亮的按钮样式

    WPF界面设计技巧(2) — 自定义漂亮的按钮样式 在WPF中,我们经常需要使用Button控件来实现各种功能。但是默认的Button样式可能并不符合我们的视觉需求。为了满足更多的设计需求,我们可以使用WPF自定义Button样式来实现我们想要的效果。 获取默认Button样式 在开始自定义Button样式之前,我们需要先了解Button控件的默认样式及其数…

    其他 2023年3月28日
    00
  • Boolean operations between triangle meshes

    Boolean operations between triangle meshes的完整攻略 Boolean operations between triangle meshes是计算机图形学中的一个重要问题,它可以用于模型编辑、CAD、虚拟现实等领域。本文将为您提供Boolean operations between triangle meshes的完整…

    other 2023年5月6日
    00
  • windowsgcc怎么安装

    WindowsGCC怎么安装 如果你需要在Windows系统上使用GCC编译器,可以使用MinGW来安装GCC。这里提供一份详细的安装步骤。 一、下载MinGW 访问官网并下载最新的MinGW版本,目前最新版本为MinGW-8.1.0。 二、安装MinGW 下载完成后,双击运行下载的 exe 文件并按照指示进行安装。在安装过程中,需要对MinGW进行一些设置…

    其他 2023年3月28日
    00
  • 深入解读Java代码组织中的package包结构

    深入解读Java代码组织中的package包结构攻略 在Java中,package(包)是一种用于组织和管理代码的机制。它可以帮助我们将相关的类和接口组织在一起,提供更好的代码可读性和可维护性。本攻略将详细讲解Java代码组织中的package包结构,并提供两个示例说明。 1. 包的定义和命名规范 包是一种逻辑上的组织方式,它将相关的类和接口放在一起。包的定…

    other 2023年9月7日
    00
  • bug级别(优先级、严重级)定义

    以下是“bug级别(优先级、严重级)定义的完整攻略”的详细说明,包括过程中的两个示例说明。 bug级别(优先级、严重级)定义完整攻略 在软件开发过程中,bug是不可避免的。为了更好地管理和解决bug,我们需要对bug进行分类和定义。其中,bug级别(优先级、严重级)是一个重要的分类标准。以下是一份关于bug级别(优先级、严重级)定义的完整攻略。 1. bug…

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