iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java类的加载时机是什么时候
  • 919
分享到

Java类的加载时机是什么时候

2023-06-25 22:06:30 919人浏览 安东尼
摘要

本篇内容主要讲解“Java类的加载时机是什么时候”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java类的加载时机是什么时候”吧!必须初始化的四种情况有四种情况类是必须要进行初始化的,对于这四种

本篇内容主要讲解“Java类的加载时机是什么时候”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java类的加载时机是什么时候”吧!

必须初始化的四种情况

有四种情况类是必须要进行初始化的,对于这四种情况原文描述如下:

但是对于初始化阶段,虚拟机规范则是严格规定了有且只有4种情况必须立即对类进行初始化,而加载、验证、准备自然需要在此之前开始。

  • 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令最常见的java代码场景是:使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。

  • 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

  • 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

  • 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

以上四点我们一一用代码来验证,第一点里面说到了四种初始化的场景,分别是:

  • ①用new关键字实例化对象

  • ②读取类静态字段

  • ③设置类的静态字段

  • ④调用一个类的静态方法

在验证之前需要达成一个共识:虚拟机在初始化类时会执行static语句块中的操作,因此我们可以根据静态语句块中的代码是否执行了来判断类是否加载。为此我创建了一个SubClass类

package com.test.JVM.classloading;public class SubClass {    static{        System.out.println("子类初始化");    }    public static int a = 10;    public static int getA(){        return a;    }}

在main方法中分别执行(每次执行一条)以下四条代码来模拟上面四个场景

package com.test.jvm.classloading;public class Main {    public static void main(String[] args) {        SubClass subClass = new SubClass();        System.out.println(SubClass.a);        SubClass.getA();        SubClass.a = 30;    }}

结果不出所料,输出结果都包含"子类初始化",说明以上四种方式确实可以会触发类的初始化。

接下来看第二点,对类进行反射调用时会触发类的初始化

package com.test.jvm.classloading;public class Main {    public static void main(String[] args) throws ClassNotFoundException {        Class.forName("com.test.jvm.classloading.SubClass");    }}

以上的反射调用同样正常输出了"子类初始化"。

第三点如果父类没有进行初始化,则要先触发父类的初始化,再创建一个父类,并且让之前的子类继承父类

package com.test.jvm.classloading;public class SuperClass {    static {        System.out.println("父类初始化");    }    public static int b = 20;}
package com.test.jvm.classloading;public class SubClass extends SuperClass {    static{        System.out.println("子类初始化");    }    public static int a = 10;    public static int getA(){        return a;    }}

这时我们再次执行上面的main方法里面的任意一条测试语句,这时发现在原来的输出"子类初始化"前输出了"父类初始化",说明了两点:①父类同样会初始化;②父类会先于子类初始化。

第四点虚拟机会先初始化包含main方法的主类,这时我们在主类中加入静态代码块

package com.test.jvm.classloading;public class Main {    static {        System.out.println("初始化主类");    }    public static void main(String[] args) throws ClassNotFoundException {        SubClass subClass = new SubClass();    }}

可以看到输出结果如下,完全印证了第四点。

Java类的加载时机是什么时候

不主动进行初始化

而对于不会主动进行初始化的情况在该书中也有以下几种情况

第一种是通过子类类名调用父类静态代码(包括静态方法和静态变量)不会进行初始化,以下也通过代码进行说明

package com.test.jvm.classloading;public class Main {    public static void main(String[] args) throws ClassNotFoundException {        System.out.println(SubClass.b);    }}

输出如下,可以看到只初始化了父类而没有初始化子类。

Java类的加载时机是什么时候

第二种是通过数组来创建对象不会触发此类的初始化

package com.test.jvm.classloading;public class Main {    public static void main(String[] args) throws ClassNotFoundException {        SuperClass[] supers = new SuperClass[10];    }}

输出为空。

Java类的加载时机是什么时候

第三种是调用final修饰的常量不会触发类的初始化,为此我在父类中加了一个常量

package com.test.jvm.classloading;public class SuperClass {    static {        System.out.println("父类初始化");    }    public static int b = 20;    public final static String STATE = "常量";}
package com.test.jvm.classloading;public class Main {    public static void main(String[] args) {        System.out.println(SuperClass.STATE);    }}

可以看到输出结果只是打印了常量的值,并没有初始化这个类。

Java类的加载时机是什么时候

补充

到这里对于书中描述的类的加载时机都已经用例子说明了,接下来展示一个在博主Boblim那看到的一个例子

class SingleTon {    private static SingleTon singleTon = new SingleTon();    public static int count1;    public static int count2 = 0;    private SingleTon() {        count1++;        count2++;    }    public static SingleTon getInstance() {        return singleTon;    }}public class Test {    public static void main(String[] args) {        SingleTon.getInstance();        System.out.println("count1=" + SingleTon.count1);        System.out.println("count2=" + SingleTon.count2);    }}

输出count1=1,count2=0,关于为什么会输出这个结果在那篇链接的博客已经做了详细的说明,同时这个输出结果也很好地佐证了下面这句话

类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的。

正是给类变量赋值时是按照顺序进行的,所以上面count2又会被重新赋值为0,才导致这个输出结果。

到此,相信大家对“Java类的加载时机是什么时候”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java类的加载时机是什么时候

本文链接: https://www.lsjlt.com/news/306403.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java类的加载时机是什么时候
    本篇内容主要讲解“Java类的加载时机是什么时候”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java类的加载时机是什么时候”吧!必须初始化的四种情况有四种情况类是必须要进行初始化的,对于这四种...
    99+
    2023-06-25
  • Java类的加载时机与过程是什么
    本篇内容主要讲解“Java类的加载时机与过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java类的加载时机与过程是什么”吧!1 开门见山以前曾经看到过一个java的面试题,当时觉得此题...
    99+
    2023-06-25
  • Java类的加载时机
    必须初始化的四种情况 有四种情况类是必须要进行初始化的,对于这四种情况原文描述如下: 但是对于初始化阶段,虚拟机规范则是严格规定了有且只有4种情况必须立即对类进行初始化,而加载、验证...
    99+
    2024-04-02
  • redis什么时候加载dump
    redis三种情况下会加载dump:通过save/bgsave命令保存数据时。满足配置文件中的save指令条件触发持久化操作时。Slave初始连接上Master时,Master会dump一份数据,传输给从库。...
    99+
    2024-04-02
  • Java类的加载时机与过程
    目录1 开门见山2 类的加载时机3 何时开始类的初始化4 被动引用例子5 类的加载过程5.1 加载5.2验证5.3准备5.4 解析5.5 初始化6 题目分析1 开门见山 以前曾经看到...
    99+
    2024-04-02
  • Java类的加载机制是什么
    这篇文章主要讲解了“Java类的加载机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类的加载机制是什么”吧!1、什么是类的加载类的加载指的是将类的.class文件中的二进制数...
    99+
    2023-06-17
  • javascript是什么时候出的
    这篇文章给大家分享的是有关javascript是什么时候出的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 javascript是1995年出的;Ja...
    99+
    2024-04-02
  • css2.1的发布时间是什么时候
    今天小编给大家分享一下css2.1的发布时间是什么时候的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。css2.1是2004年...
    99+
    2023-07-05
  • Java匿名内部类在什么时候用
    Java匿名内部类通常在以下情况下使用:1. 当一个类只需要使用一次,并且这个类没有名字,可以使用匿名内部类来实现。这样可以避免创建...
    99+
    2023-08-15
    Java
  • 什么时候才是微服务拆分的最佳时机?
    提到微服务,服务拆分是绕不过去的话题,但是微服务不是说拆就能拆的,需要很多的前提条件。首先,首先在基础设施层面,要有一个持续集成的平台,使得服务在拆分的过程中,功能的一致性,这种一致性不能通过人的经验来,而需要经过大量的回归测试集,并且持续...
    99+
    2023-06-05
  • jvm类加载器,类加载机制是什么
    这篇文章主要介绍“jvm类加载器,类加载机制是什么”,在日常操作中,相信很多人在jvm类加载器,类加载机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm类加载器,类加载机制是什么”的疑惑有所帮助!...
    99+
    2023-06-16
  • vue是什么时候发布的
    这篇“vue是什么时候发布的”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“vue是什么时候发布的”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们一起来看看具...
    99+
    2023-06-06
  • ecmascript10是什么时候发表的
    这篇文章主要讲解了“ecmascript10是什么时候发表的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ecmascript10是什么时候发表的”吧! ...
    99+
    2024-04-02
  • php是什么时候发明的
    这篇“php是什么时候发明的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php是什么时候发明的”文章吧。php是在服务器端...
    99+
    2023-07-05
  • win10 9860什么时候开放下载
    win10 9860下载是很多用户想知道的吧,微软更新了技术预览版Windows 10,最新版本号为Build 9860。由于需要测试通过新的Windows   这个最新的技术预览版Windo。 ...
    99+
    2023-06-08
    win109860 win10
  • html5概念提出的时间是什么时候
    这篇文章主要介绍了html5概念提出的时间是什么时候的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇html5概念提出的时间是什么时候文章都会有所收...
    99+
    2024-04-02
  • win11可以安装的时间是什么时候
    本篇内容介绍了“win11可以安装的时间是什么时候”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win11什么时候可以安装答:预览版现在就可...
    99+
    2023-07-01
  • spring类的加载机制是什么
    Spring框架的类加载机制主要涉及到两个方面:类路径扫描和类加载器。 类路径扫描:Spring框架在启动时会扫描应用程序的类路...
    99+
    2024-04-02
  • JAVA类的加载过程是什么
    JAVA类的加载过程主要分为加载、链接和初始化三个阶段。 加载:类加载是指将类的.class文件从文件系统或网络加载到内存中,并...
    99+
    2023-10-26
    JAVA
  • Web3.0时代什么时候到来,Web3.0有什么机会?
    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业...
    99+
    2023-09-26
    web3 web3.0 去中心化 区块链 智能合约 原力计划
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作