点击 Mr.绵羊的知识星球 解锁更多优质文章。

目录

一、类的加载

1. 类加载

2. 类加载器

二、父类和子类加载顺序

1. 案例(代码)


一、类的加载

1. 类加载

当程序要使用某些类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

(1) 加载:将class文件连入内存,并为之创建一个class对象,任何类被使用时系统都会建立一个class对象

(2) 连接:

a. 验证:是否有正确的内存结构,并和其他类协调一致。

b. 准备:负责为类的静态成员分配内存,并设置默认初始化值。

c. 解析:将类的二进制数据中的符号引用替换为直接引用。

(3) 初始化:

a. 创建类的实例。

b. 访问类的静态变量

c. 调用类的静态方法

d. 使用反射方式来强制创建某个类或者某个接口对应的class对象

e. 初始化某个类的子类

f. 直接使用java.exe命令来运行某个主类

2. 类加载器

(1)概述:负责将class文件加载到内存当中,并为之生成对应的class对象

(2)组成:

a. Bootstrap ClassLoader 根类加载器:被称之为引导类加载器,负责java核心类的加载,比如System,String等。在JDK中JRE的lib目录下rt.jar文件中

b. Extension ClassLoader 拓展类加载器:负责JRE的拓展目录中jar包的加载,在JDK中JRE的lib目录下的ext目录

c. sysetm CalssLoader 系统类加载器:负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指的jar包和类路径

二、父类和子类加载顺序

如果有人问我们父类和子类加载顺序,我们一定会说先加载父类后加载子类。但是如果给你两个类,你能准确地说出每个属性或者方法加载的顺序吗?

如果你答对了,那你应该属于那20%对类的加载有研究的人,其实大部分代码并不需要我们关心每个属性或者方法加载的顺序,所以这里也是往往让人忽略的。话不多说,上代码!

1. 案例(代码:git地址)

(1) 父类

/*** Parent: 父类** @author wxy* @since 2023-01-08*/
public class Parent {private static int serialNumber = 0;public static final String PUB_ATTR = printAndReturn("parent public static attr");private static final String PRI_ATTR = printAndReturn("parent private static attr");public Parent() {printAndReturn("parent construct");}static {printAndReturn("parent static code block");}{printAndReturn("parent anonymous inner class");}private final String code = printAndReturn("parent member variable code");/*** 打印str参数** @param str 需要打印的值*/public static String printAndReturn(String str) {System.out.println(++serialNumber + ". " + str);return str;}
}

(2) 子类

/*** Child: 子类** @author wxy* @since 2023-01-08*/
public class Child extends Parent {static {printAndReturn("child static code block");}private static final String PRI_ATTR = printAndReturn("child private static attr");public static final String PUB_ATTR = printAndReturn("child public static attr");private final String code = printAndReturn("child member variable code");public Child() {printAndReturn("child construct");}{printAndReturn("child anonymous inner class");}
}

(3) 测试方法

/*** 运行方法** @author wxy* @since 2023-01-08*/
public class ClassLoadCase1Main {public static void main(String[] args) {/* 建议运行下面一次性仅运行一个方法比较清晰 */createParent();createChild();createParentAndChild();}private static void createParent() {/*输出:1. parent public static attr2. parent private static attr3. parent static code block4. parent anonymous inner class5. parent member variable code6. parent construct*//* 由上述输出可知: static修饰最先输出(谁在上面谁先执行, 一般都是public修饰在最上面)->匿名内部类和成员变量(谁在上面谁先执行)->最后是其构造方法 */Parent parent = new Parent();}private static void createChild() {/*1. parent public static attr2. parent private static attr3. parent static code block4. child static code block5. child private static attr6. child public static attr7. parent anonymous inner class8. parent member variable code9. parent construct10. child member variable code11. child anonymous inner class12. child construct*//* 由上述输出可知加载是顺序: 加载父类static->加载子类static->加载父类匿名内部类成员变量及构造->加载子类匿名内部类成员变量及构造 */Child child = new Child();}private static void createParentAndChild() {/*输出: ---parent---1. parent public static attr2. parent private static attr3. parent static code block4. parent anonymous inner class5. parent member variable code6. parent construct---child---7. child static code block8. child private static attr9. child public static attr10. parent anonymous inner class11. parent member variable code12. parent construct13. child member variable code14. child anonymous inner class15. child construct*//* 创建两个对象或者多个对象时, static修饰的常量或者变量仅加载一次(对比单独创建child和创建parent和child可知) */System.out.println("---parent---");Parent parent = new Parent();System.out.println("---child---");Child child = new Child();}
}

Java类的加载及父类子类加载顺序相关推荐

  1. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  2. 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

    前言 package com.jvm.classloader;class Father2{public static String strFather="HelloJVM_Father&qu ...

  3. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  4. Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)

    [1]类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载->验证->准备->解析->初始化->使用->卸载 其中,类加载包括5个阶段: 加载 ...

  5. 【JVM】Java类的加载流程以及双亲委派,全盘托管,以及如何打破双亲委派机制

    JVM基础生命周期流程图 只有main()方法的java程序执行流程 classLoader.loadClass()的类加载流程(除引导类,所有类都一样) 加载:通过IO查找读取磁盘上的字节码文件,在 ...

  6. 深入理解Java虚拟机:Java类的加载机制

    本篇内容包括:Java 类的加载机制(Jvm 结构组成.Java 类的加载).类的生命周期(加载-验证-准备-解析-初始化-使用-卸载).类加载器 以及 双亲委派模型. 一.Java 类的加载机制 1 ...

  7. java 类 重新加载_Java动态类加载和重新加载的详细介绍

    本篇文章给大家带来的内容是关于Java动态类加载和重新加载的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Java中可以在运行时加载和重新加载类,虽然并不像我们想像中那么简 ...

  8. Java深度历险(二)——Java类的加载、链接和初始化

    在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行.本文接着上一篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式 ...

  9. java类的加载,链接,初始化

    Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始 ...

最新文章

  1. python去除英文字符中的数字和标点符号
  2. Nginx强制https访问
  3. apache shiro jar包_只需要6个步骤,springboot集成shiro,并完成登录
  4. Python 技术篇-用request库调用莉莉机器人api接口实现与机器人对话实例演示
  5. Leetcode 234 回文链表 (每日一题 20210730)
  6. sklearn自学指南(part4)--使用手册的目录
  7. 关闭子窗口 父窗口自动刷新
  8. Java-Scanner进阶使用
  9. Python程序控制结构(二)循环结构:for in遍历循环,while无限循环,循环+else
  10. 九度OJ-1525 子串逆序打印
  11. 【LoadRunner】解决LR11无法录制Chrome浏览器脚本问题
  12. vs2013 mfc连接MySQL数据库
  13. honeywell Xenon 1900 usb
  14. linux查看scsi设备id号,scsi_id查询
  15. 前端组件化开发实践总结
  16. HTML、JS、CSS 实现果冻按钮效果 代码解读
  17. 算是我看源码时的一个小技巧吧~
  18. 为什么upupoo显示服务器维护中,首先,电脑能正常上网,有的网站可以上传图片,但就是不能显示上传图片的功能按钮,网页打开都正常。...
  19. Active: inactive (dead)
  20. 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠

热门文章

  1. 基于Python+django的 医院排队叫号系统-计算机毕业设计
  2. python使用Axes3D画三维图加入legend图例时报错AttributeError: ‘Poly3DCollection‘ object has no attribute ‘_edgecolo
  3. java 随机发牌_java实现扑克牌发牌器
  4. ChatGPT学习-如何向ChatGPT提问
  5. Rabbitmq消息中心_消息中心总体方案
  6. 基于机器学习的车辆检测算法研究方法概述
  7. matlab多元变量最优解,模拟退火算法确定多个变量的最优解
  8. Filter-url拦截
  9. CStudioFile文件的输出
  10. angular1的分页