`
eric_weitm
  • 浏览: 242141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

继承环境下java初始化顺序

 
阅读更多

一、示例代码

package javaDemo;

class Parent {

public static String p_StaticField1 = "父类--静态变量1";

// 变量

public String p_Field = "父类--变量";

protected int i = 9;

protected int j = 0;

// 静态初始化块

static {

 System.out.println(p_StaticField1);

 System.out.println("父类--静态初始化块");

}

// 初始化块

{

 System.out.println(p_Field);

 System.out.println("父类--初始化块");

}

public static String p_StaticField2 = "父类--静态变量2";

// 构造器

public Parent() {

 System.out.println("父类--构造器");

 System.out.println("i=" + i + ", j=" + j);

 j = 20;

}

public static String p_StaticField3 = "父类--静态变量3";

}

 

public class SubClass extends Parent {

// 静态变量

public static String s_StaticField = "子类--静态变量";

// 变量

public String s_Field = "子类--变量";

// 静态初始化块

static {

 System.out.println(s_StaticField);

 System.out.println("子类--静态初始化块");

}

// 初始化块

{

 System.out.println(s_Field);

 System.out.println("子类--初始化块");

}

// 构造器

public SubClass() {

 System.out.println("子类--构造器");

 j = -1;

 System.out.println("i=" + i + ",j=" + j);

}

// 程序入口

public static void main(String[] args) {

 System.out.println("子类main方法");

 new SubClass();

}

 

public static String s_StaticField2 = "子类--静态变量1";

}

 

二、java中的初始化顺序:

1、父类static变量和语句块(顺序依赖于定义的顺序)

2、子类static变量和语句块

3、父类的直接初始化块

4、父类的构造函数

5、子类的初始化块

6、子类的构造函数

 

三、原因:

1、jvm首先是加载类,内部做了链接操作之后,才能执行代码,所以加载一定在执行以先,所以static的一定早于别的;

加载的时候是先加载父类的,所以父类static的早于子类static

2、所有子类的构造函数第一句 一定是 调用父类构造函数,所以4在6以先。

3、按着顺序貌似3应该在5后,即顺序是 1 2 5 3 4 6 ,但是这样会导致 子类先初始化,父类后初始化,进而导致语义错误(子类没法覆盖流程),所以顺序必须是父类完全处理结束之后才开始处理子类

4、初始化块在编译期就可以确定初始化顺序(语义上不是编译期,java都是在jvm中执行),而构造函数是一个函数,在运行时才能执行,所以初始化块在前

 

分享到:
评论

相关推荐

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    类继承的初始化顺序类,继承的初始化顺序

    在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会有一个特定的初始化顺序。这个顺序通常遵循以下步骤: 1. **基类静态成员初始化**:如果基类中有任何静态成员,则会在程序启动时按照...

    java程序初始化顺序

    以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

    java面试题-类的初始化顺序.doc

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    Java类继承关系中的初始化顺序实例详解

    Java类继承关系中的初始化顺序实例详解 Java类继承关系中的初始化顺序是Java编程语言中的一個重要概念。该概念关系到类的初始化顺序,静态成员变量的初始化顺序,普通成员变量的初始化顺序等。在本文中,我们将详细...

    java中类的初始化顺序

    2. **继承关系下的初始化顺序** ```java class Parent { // 父类静态成员变量 public static String p_StaticField = "父类静态"; // 父类实例成员变量 public String p_Field = "父类实例"; // 父类静态...

    “礼让”原则学习Java对象初始化顺序.pdf

    "Java 对象初始化顺序学习指南" 在学习 Java 编程语言时,对象初始化顺序是一个非常重要的知识点,但是许多学生却感到困惑和困难。事实上,Java 对象初始化顺序并不难理解,只需要掌握“礼让”原则和 JVM 的执行...

    探究java的ClassLoader及类变量初始化顺序

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    JAVA面试题解惑系列——类的初始化顺序

    在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...

    java对象的初始化顺序[参考].pdf

    Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    在了解类的初始化顺序之前,我们需要了解 JAVA 中的继承关系。在 JAVA 中,一个子类可以继承一个父类,子类可以继承父类的成员变量和方法。同时,子类也可以拥有自己的成员变量和方法。 现在,让我们来看一个简单的...

    JAVA类的初始化顺序文.pdf

    子类 --构造器 这个输出揭示了在继承关系中类的初始化顺序: 1. **静态成员和静态初始化块**:首先,会按照父类到子类的顺序初始化静态变量和执行静态初始化块。在上面的例子中,"父类 --静态变量" 和 "子类 --静态...

    JAVA面试题解惑系列类的初始化顺序JAVA程序员JAVA工程师面试必看.pdf

    Java语言中的类初始化顺序是面试中常见的问题,尤其对于Java程序员和工程师来说,理解这一概念至关重要。本篇文章将深入解析类初始化的顺序以及在继承情况下的表现。 首先,我们需要明确类初始化顺序的基本规则: ...

    类初始化顺序示例讲解

    2. **继承关系中的初始化顺序**:在继承关系中,父类的成员变量与初始化块会在子类的对应部分之前执行。 3. **初始化块与成员变量初始化的顺序**:如果静态成员变量定义与静态初始化块同时存在,则先执行静态成员...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    这个输出揭示了在继承关系下类的初始化顺序: 1. **静态变量和静态初始化块**:首先,按照声明的顺序,执行父类的静态变量和静态初始化块,然后执行子类的静态变量和静态初始化块。这是因为静态成员属于类,不依赖...

    成员的初始化顺序和多态性

    在Java编程语言中,理解成员变量的初始化顺序对于正确地设计和实现类结构至关重要。通过本实验,我们将深入了解成员变量的初始化顺序,以及如何通过实际代码示例来验证这些概念。 #### 实验步骤解析 ##### 步骤一...

    java类中元素初始化顺序详解

    Java 类的初始化顺序是一个关键的编程概念,尤其对于理解和避免潜在的运行时错误至关重要。在 Java 中,类的元素初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**: 首先,Java 解释器会执行类中的静态...

    java 继承关系的加载顺序

    总结,Java中继承关系的加载顺序遵循“先父后子”的原则,从加载到初始化,都是先处理父类,再处理子类。理解这一顺序对于理解和优化代码、避免潜在问题至关重要。同时,Java的类加载机制还支持动态加载和灵活的代码...

    Java中对象初始化顺序的详细介绍

    这种情况下,初始化顺序如下:首先,`Lower`类的实例创建并分配默认值,然后调用`Upper`的构造器,接着执行`Initializer.initialize()`,该方法根据对象的实际类型(`Lower`)来设置字段的值。 5. **默认值**:即使...

Global site tag (gtag.js) - Google Analytics