Java继承时的初始化过程:
1. 父类对象内存分配
2. 父类字段默认初始化
3. 子类对象内存分配
4. 子类字段默认初始化
5. 进入父类构造-> 父类成员显示初始化(定义字段时设置的字段初值)
-> 执行父类构造体(此时可以调用抽象方法,所有父类字段已初始
化完毕,但子类字段尚未进行显示初始化)
6. 进入子类构造-> 子类成员显示初始化(定义字段时设置的字段初值)
-> 执行子类构造体(此时所有字段已经显示初始化)
package com.jwh.cn;
public class ExtendsRun extends HelloWorld{
public int i=1;
public ExtendsRun() {
super();
System.out.println("hello world");
System.out.println(this+"2");
}
public static void main(String[] args) {
ExtendsRun er = new ExtendsRun();
}
@Override
public String toString() {
return super.toString(); //第一种情况
// return new Integer(i).toString(); //第二种情况
}
}
class HelloWorld{
public int i=2;
public HelloWorld() {
System.out.println("Hello World");
System.out.println(this+"1"); //this在此相当于this.toString(),是一个父类的应用,指向子类的对象
}
@Override
public String toString() {
return new Integer(i).toString();
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
第一种输出结果为
Hello World
21
hello world
22
第二种情况下输出的居然是
Hello World
01
hello world
12
分析过程:
1, 程序充main进入程序后先对对父类和子类的属性默认赋值,int默认为0,此时super.i=0 this.i=0
2, 然后进入父类的构造函数 ,对父类的属性显示赋值,此时super.i=2
3, 打印”this+”1”” 注意:this是父类的一个引用,指向子类的对象,相当于是this.toString(),调用子类的toString()
4, 第一种情况:运行子类的toString(),调用父类的toString(),得到换回值为super.2,打印21
第二种情况:运行子类的toString(),换回子类的i值,此时子类i值还没有显性赋值,所以为0,打印为01
5, 进入子类的构造函数,对子类的属性显性赋值,此时this.i=1
6, 第一种情况:运行子类的toString(),调用父类的toString(),得到换回值为super.2,打印22
第二种情况:运行子类的toString(),换回子类的i值,此时子类i值已经显性赋值,所以为1,打印为12。
分享到:
相关推荐
当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...
为了更好地理解类继承初始化顺序的概念,下面通过一段示例代码来进行详细分析: ```java class Base { public Base() { System.out.println("Base constructor"); } } class Derived extends Base { public ...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
- 当多个线程同时尝试初始化同一个类时,Java保证只会执行一次类的初始化过程。这是由JVM的同步机制保证的,避免了数据竞争的问题。 5. **接口初始化**: - 接口没有实例变量,所以不存在实例初始化阶段。接口的...
这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...
本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础知识 1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**...
Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...
Java 对象初始化顺序是指在 Java 程序中,对象的初始化过程中发生的顺序问题。这是 Java 编程语言的基础知识点之一,但是许多学生在学习和使用时总是感到困惑和困难。 二、JVM 执行过程中的“礼让”原则 JVM 在...
子类 --静态初始化块 "); 34. } 35. 36. // 初始化块 37. { 38....这个顺序同样适用于继承关系,只是会先初始化父类的部分,再初始化子类的部分。掌握这一知识能帮助程序员更好地设计和实现Java程序。
在本文中,我们将详细介绍Java类继承关系中的初始化顺序,并通过实例形式对比分析Java非继承关系中的初始化与继承关系中的初始化相关原理与操作技巧。 首先,让我们来了解Java类继承关系中的初始化顺序。在Java中,...
理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...
特别要注意的是,在子类的初始化过程中,子类的静态变量和静态初始化块会在父类的变量、初始化块、构造器之前就被初始化。也就是说,在父类完全初始化完毕之前,子类的静态成员已经完成初始化了。 这个顺序很重要,...
Java 在 HashMap 初始化时赋初值过程解析 Java 中的 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。在初始化并赋初值时,我们通常使用 `HashMap, Object> map = new HashMap();` 的方式...
本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即内存的自动清理。 首先,让我们详细了解一下Java中的构造器初始化。构造器是Java中用于初始...
在这个特定的程序中,我们看到了一个关于Java继承的实例,它演示了子类对象初始化时涉及的各个步骤,包括构造方法、初始化值、父类构造方法以及父类的初始化值。 首先,我们有一个名为`Parent`的父类,它有两个实例...
4. **初始化委托**:在上述示例中,`Initializer.initialize()`方法的调用展示了初始化过程中的委托行为。这种情况下,初始化顺序如下:首先,`Lower`类的实例创建并分配默认值,然后调用`Upper`的构造器,接着执行`...
下面,我们从三个维度来分析 Java 对象的初始化过程。 一、从程序运行维度分析 在 Java 中,对象初始化是一个复杂的过程。我们可以通过一个例子来看一下对象初始化的过程: ```java class P { int x = 11; int ...
总结,Java中继承关系的加载顺序遵循“先父后子”的原则,从加载到初始化,都是先处理父类,再处理子类。理解这一顺序对于理解和优化代码、避免潜在问题至关重要。同时,Java的类加载机制还支持动态加载和灵活的代码...
在了解类的初始化顺序之前,我们需要了解 JAVA 中的继承关系。在 JAVA 中,一个子类可以继承一个父类,子类可以继承父类的成员变量和方法。同时,子类也可以拥有自己的成员变量和方法。 现在,让我们来看一个简单的...
当我们谈论“java中与继承有关的程序内存分析”时,主要关注的是在Java程序运行时,内存是如何为继承体系的实例分配的。 Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。在讨论继承时...