Java类加载顺序

article/2025/10/12 5:30:50

引言

在日常工作中,比较少的机会会探究类加载机制,类加载顺序,但是这部分在代码优化,深入学习jvm有着极大的帮助,本文帮助不太了解类加载顺序的人从代码层级了解类加载顺序。

示例1-普通类

class Foo{private int x;{System.out.println("1");}static {System.out.println("2");}public Foo() {System.out.println("3");System.out.println("x=" + x + ",z=" + z);}public Foo(int x) {super();System.out.println("4");this.x = x;}static int z = 8;public void say() {System.out.println("5");}public static void say2() {{System.out.println("6");}System.out.println("7");}
}
public class App {public static void main(String[] args) {Foo.say2(); }
}

很多人拿到这样的代码就会打颤,别着急,接着向下看,如果你耐心读完此文,相信再遇到此类的问题,乃至面试题都会如鱼得水,整理的头头是道!

java类中包含的成员

首先,我们了解一下java类中包含的成员有哪些

成员解释
成员变量类的直属变量
方法类的直属方法
局部变量方法体中定义的变量和方法中涉及的变量
代码块方法体中定义的代码块
构造代码块类的直属方法跨
静态块类的直属方法块
静态方法static修饰的方法
静态成员变量static 修饰的类的直属变量
成员内部类在一个类内部进行其他类结构的嵌套操作
局部内部类定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
匿名内部类平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护,例如子线程的runnable对象
静态内部类定义在了成员位置上,并且使用static来去修饰的类
类实例化顺序

了解了类的成员信息后,下面讲下类实例化顺序

  1. 执行静态块
  2. 执行构造代码块(构造代码块一定在构造器前执行)
  3. 执行构造器

了解了这些之后,可能有些细心地童鞋会有疑问,还有静态成员变量呢?普通成员变量呢?他们什么时候执行?
我们可以把静态成员变量看做静态块,普通成员变量看做构造代码块来处理,这样是不是简单很多。
在这里插入图片描述

类加载的顺序
  1. 调用构造器
  2. class.forname
  3. 调静态字段
  4. 调静态方法
public class AppTest {public static void main(String[] args) {f1();}static AppTest t = new AppTest();static {System.out.println("1");}{System.out.println("2");}AppTest() {System.out.println("3");System.out.println("a=" + a + ",b=" + b);}public static void f1() {System.out.println("4");}int a = 110;static int b = 112;
}

类加载的时机

类从被加载到虚拟机内存中开始,到卸载出内存为止,

内部类

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

子类C继承父类F

当调用子类静态方法时,执行顺序为

  1. 按照继承顺序从顶级父类开始加载类
  2. 执行子类C中的静态块
  3. 执行子类静态块
  4. 执行调用方法

当调用子类非静态方法

  1. 初始化(加载)所有超类
  2. 加载自身静态块
  3. 再次初始化所有超类及自身
  4. 执行调用方法
解释
  1. 按照继承顺序从顶级父类开始所加载类(按照顶级类到子类开始把相关类加载进内存中)
  2. 因为使用了new,所以会创建一个全新的子类对象,所以之前的超类由于连带关系均需要为了创建新的子类对象而再次执行一遍类加载,但是静态块已经加载完毕,无需再次加载,所以此时仅加载构造代码块和构造器
  3. 得到引用对象,执行代码

接口

  1. 在有继承关系的类中引用多个不同接口时,需要注意接口内定义的常量名称不可重复,如果重复在调用常量时,编译器会提示The field Father.v is ambiguous(所使用的字段不明确)
  2. 接口内的常量初始化是在被调用时初始化,当且仅当仅调用接口中的某常量时,运行且不会影响实现接口的类,例如类Foo实现了接口Bar,Bar中有常量S,使用Foo.S仅会初始化S,不会调用Foo内部任何成员。

http://chatgpt.dhexx.cn/article/kUslxspx.shtml

相关文章

Java类加载器(ClassLoader)

Java中一个类从它的class文件被加载进入虚拟机到被JVM卸载,其生命周期大致可以分为以下几步: 每个步骤详细内容可以参考相关JVM书籍,在整个流程中除了加载之外的几个步骤主要都是由JVM控制执行的,留给我们手动干涉的空间不是很大…

java中类的加载

类加载器的作用: java中源文件通过java编译器产生了字节码文件,而类加载器及时负责将字节码文件加载到内存中。并将这些静态数据转化成方法区中运行时数据结构。然后再堆中生成一个代表个类的class对象,即java.lang.class类对象。 类缓存&am…

Java类加载过程详解

类的生命周期 类的加载类加载过程加载链接验证准备解析 初始化 总结 首先我们先简单了解一下整个JVM的体系结构是怎样的,如下图所示(图1): 再详细具体一点(图2): 上面的图片有些地方看不懂没关系…

什么是类的加载(Java)

一、什么是类的加载 java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。 其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某…

【JVM】Java类加载机制详解

【JVM】Java类加载机制详解 文章目录 【JVM】Java类加载机制详解一:类加载子系统1:类加载器子系统的作用2:加载器 ClassLoader 的角色 二:类的加载过程1:加载阶段2:验证阶段:确保被加载的类的正…

JAVA开发(java类加载过程)

1、java语言的平台无关性。 因为java语言可以跑在java虚拟机上,所以只要能装java虚拟机的地方就能跑java程序。java语言以后缀名 .java为文件扩展名。通过java编译器javac编译成字节码文件.class 。java字节码文件通过java虚拟机解析运行。在虚拟机级别对class文件…

图解Java类加载机制

文章目录 前言类加载的概述双亲委派加载机制类加载的隔离机制contextClassLoaderSPI用处找文件用处 类加载的顺序顺序概述类加载的一般方式类加载的触发点 类的实例化多线程环境下,为何也只有一个Class的对象 图解和举例普通Java应用日常Web应用 附录 前言 网上有很…

【Java 】Java 类加载和类加载器

文章目录 前言一、加载二、链接验证准备解析 三、初始化发生的时机不会触发类的初始化 四、类加载器双亲委派模式 前言 Java 的类加载阶段分为:加载、链接、初始化,而链接的过程中包括:验证、准备、解析。 一、加载 将类的字节码载入方法区…

Java类加载过程图解

朋友给我发了一道有意思的题目,如下 为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。 这就扯到基础理解上了,就是Java是如何加载一个类的呢? 上图是我绘制的…

Java类加载器加载类顺序

java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(JVM)解释执行,.class字节码文件本身是平台无关的,但是jvm却不是,为了实现所谓的一次…

java类如何加载

最近研究java的进阶知识,先从java类加载机制学起,原先看过《深入理解java虚拟机》这本书,奈何书的知识面太广及自身只看了一遍,很多知识并不是很理解,今天看了几篇别人讲解的java类加载机制,觉得讲的很好&a…

JVM——Java类加载机制总结

1. 类加载器的组织结构 转载请注明出处:JVM——Java类加载机制总结_SEU_Calvin的博客-CSDN博客 类加载器 ClassLoader是具有层次结构的,也就是父子关系。其中,Bootstrap是所有类加载器的父亲。 (1)Bootstrapclass lo…

深入理解Java类加载器(1):Java类加载原理解析

1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解…

深入理解Java类加载器(一):Java类加载原理解析

摘要: 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它…

【Java · 类加载】类加载器

1. 概述 类加载器是 JVM 执行类加载机制的前提。 ClassLoader的作用: ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目…

java类加载

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 一、类加载过程 加载指…

Java的类加载

1、类的加载过程 Java文件通过javac编译成.class二进制字节码文件,然后交给类加载器加载到我们的虚拟机内存中,最后我们通过new 对象来实现对象的初始化,才能调用和执行这个类,类的加载有三步:加载、连接、初始化。 1.1、加载 …

Java类的加载

类的生命周期 当java源代码文件被javac编译成class文件后,并不能直接运行,而是需要经过加载,连接和初始化这几个阶段后才能使用。在使用完类或被销毁后,JVM会将类卸载掉。 类加载的过程 类加载的过程需要经过三个阶段分别是&a…

「WAVE SUMMIT 2022深度学习开发者峰会」火热来袭

「WAVE SUMMIT 2022深度学习开发者峰会」火热来袭! 会上您将了解以飞桨为代表的深度学习领域的最新技术突破! 看最新的AI技术如何助力我国产业发展,先人一步了解技术风向。 5月20日 13:00期待与您相聚云端 报名即送好礼,快来参与吧…

Wave(.wav)文件格式

Wave文件格式主要是用来存储音频PCM数据的,其实也可以存储非PCM音频数据,这种情况我们就不考虑了。文件的扩展名为“.wav”,采用RIFF文件结构。 一、RIFF文件格式简介 1、RIFF文件是由一个一个的chunk组成的,并且chunk之间可以嵌…