`

Java类被加载时执行的顺序问题

 
阅读更多


public class Parent
{
//1
static int a = 1;
//2
static
{
a = 10;
System.out.println("parent static code");
}
//4
public Parent()
{
System.out.println("Parent constructor");
System.out.println("Parent a=" + a);
}

public static void main(String[] args)
{
System.out.println("***************");
Parent c = new Child();
}
}
class Child extends Parent
{
static int a = 2;
//3
static
{
a = 20;
System.out.println("child static code");
}
//5
public Child()
{
System.out.println("Child constructor");
System.out.println("Child var a=" + a);
}

}

执行结果:

run:
parent static code
***************
child static code
Parent constructor
Parent a=10
Child constructor
Child var a=20
BUILD SUCCESSFUL (total time: 0 seconds)

Java 语言是动态链接的,只有在需要的时候才去加载java类,在加载java类的时候,首先执行类里面的static代码块,然后进入main入口函数,调用子类的构造函数,生成子类的对象,子类被加载,调用子类的static代码块,然后开始调用子类的构造函数,调用之前要是检查到父类还没实例化,前去调用父类的构造函数,保证父类实例化完毕了再去调用子类的构造函数,在子类构造函数中第一句可以用super()调用父类的构造函数感觉像是重新实例化了一个对象!

现在将程序的入口从父类中转移到子类中,我们再看一下输出的执行流程。。。

class Parent
{
//1
static int a = 1;
//2
static
{
a = 10;
System.out.println("parent static code");
}
//4
public Parent()
{
System.out.println("Parent constructor");
System.out.println("Parent a=" + a);
}


}
public class Child extends Parent
{
static int a = 2;
//3
static
{
a = 20;
System.out.println("child static code");
}
//5
public Child()
{
System.out.println("Child constructor");
System.out.println("Child var a=" + a);
}

public static void main(String[] args)
{
System.out.println("***************");
Parent c = new Child();
}
}

执行结果:

run:
parent static code
child static code
***************
Parent constructor
Parent a=10
Child constructor
Child var a=20
BUILD SUCCESSFUL (total time: 0 seconds)

由此可以知道,我们在要加载拥有入口函数的子类之前,是要首先加载这个函数的父类的。。。。。

分享到:
评论

相关推荐

    Java类的完整构造执行顺序

    在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...

    java面试题静态加载顺序构造方法

    记住,面试有可能会标出一些语句的,让你选择这些语句的执行顺序。不过只要知道原理,就没什么难的了。 执行先后顺序: 1、类加载到内存时static 加载进内润 2、调用类的构造方法时先调用父类的构造方法,在调用...

    Java类加载器原理

    - `findClass()`:从Java 1.2开始,自定义类加载器通常只需要重写此方法,当父类加载器找不到类时,此方法会被调用来查找类。 - `defineClass()`:这是一个final方法,用于将字节数组转换为Class对象,实现字节码...

    Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

    Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...

    Java类的基本运行顺序

    只有当类被首次主动使用时(如创建类实例、访问静态变量或方法),初始化才会发生。 在实际开发中,我们可能需要通过工具来辅助理解和调试类的加载和初始化过程。例如,`jdb`(Java Debugger)和`javap`(Java ...

    java 继承关系的加载顺序

    当一个类被首次引用时(例如通过new关键字创建对象,或者调用静态方法),JVM会启动类加载过程。 2. 加载 在加载阶段,JVM寻找对应的.class文件,并将其转换为内存中的Class对象。如果类存在继承关系,JVM首先加载...

    Java中类的加载顺序执行结果

    Java中类的加载顺序执行结果 Java 中类的加载顺序执行结果是指在 Java 语言中,类的加载顺序执行结果是如何进行的。下面我们将详细介绍 Java 中类的加载顺序执行结果的相关知识点。 类的加载 在 Java 语言中,类...

    java应用程序类加载器,ClassLoader for java Application

    总结来说,Java应用程序类加载器是Java程序执行的关键部分,它负责在运行时找到并加载类,而它的灵活性和可配置性为开发者提供了强大的能力来适应各种复杂的应用场景。理解并掌握类加载器的工作原理,能帮助我们更好...

    Java类加载初始化的过程及顺序

    * 构造器的执行顺序:构造器的执行顺序是按照父类到子类的顺序进行的,即父类的构造器会先被执行,然后是子类的构造器。 * 非静态成员变量的初始化:非静态成员变量会被赋予默认值,如果是基本类型则为默认值,如果...

    类加载的工具

    在Java编程语言中,类加载器(ClassLoader)是运行时环境的重要组成部分,它负责将类的字节码从各种来源(如硬盘、网络或内存)加载到Java虚拟机(JVM)中,使得程序能够执行。类加载工具则是辅助开发者理解和分析类...

    Java类加载器加载类顺序

    java ClassLoader的学习  java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class...  一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL

    详解Java中类的加载顺序

    Java中的类加载机制是JVM(Java虚拟机)在运行时动态加载类的关键特性,它遵循“按需加载”和“延迟加载”的原则。当程序第一次需要使用某个类的信息时,JVM才会加载该类。这种策略提高了程序的运行效率,因为只有...

    Java类继承初始化顺序

    静态初始化块用于初始化类级别的静态变量,它们只在类加载时执行一次。 2. **成员变量初始化**:接下来,初始化父类的非静态成员变量,这是通过调用父类的构造器实现的。Java规定每个子类实例在构造之前必须先调用...

    Java 类在 Tomcat 中是如何加载的(过程分析)

    Java 类在 Tomcat 中的加载过程是一个关键的环节,它涉及到如何有效地管理和执行Web应用程序的类。理解这一过程对于开发和调试基于Java的Web应用程序至关重要。以下是对标题和描述中所述知识点的详细解释: 1. **类...

    Java类的基本运行顺序-Java教程共1页.pdf.zi

    这个"Java类的基本运行顺序"教程可能还涵盖了如何通过自定义类加载器来扩展类的加载行为,以及如何调试类加载问题等内容。了解这些基础知识对于理解和优化Java应用程序的性能至关重要,尤其是在大型企业级应用中。 ...

    详解java中继承关系类加载顺序问题

    今天,我们来详解Java中继承关系类加载顺序问题,包括类加载顺序、构造方法调用顺序、静态代码块执行顺序等。 首先,让我们来看一个简单的示例代码: ```java public class SonClass extends ParentClass{ public...

    Java类加载机制学习1

    这时,自定义类加载器如`ParentLastClassLoader.java`可以帮助我们实现这个目标,通过改变类加载顺序,使得新的类加载器可以加载新的类而不影响旧的代码。 线程上下文类加载器(Thread Context ClassLoader)是Java...

    译 Java类加载机制(二)

    总的来说,Java类加载机制是Java程序运行的基础,理解其原理和机制对于优化性能、排查问题以及进行高级应用开发都至关重要。通过阅读“译 Java类加载机制(一、二)”的文档,可以更深入地掌握这些知识,并应用于...

Global site tag (gtag.js) - Google Analytics