java类加载和初始化_java静态变量什么时候初始化

java类加载和初始化_java静态变量什么时候初始化????Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)????基础推荐:Java基础教程系列????实战推荐:SpringBoot基础教程????简介:Java领域优质创作者????、CSDN哪吒公众号作者✌、Java架构师奋斗者????????扫描主页左侧二维码,加入群聊,一起学习、一起进步????欢迎点赞????收藏⭐留言????目录一、类的加载与ClassLoader的理解1、加载2、链接3、初始化二、什么时候会发生类初始化1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

? Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
? 基础推荐:Java基础教程系列
? 实战推荐:Spring Boot基础教程
? 简介:Java领域优质创作者?、CSDN哪吒公众号作者✌ 、Java架构师奋斗者?
? 扫描主页左侧二维码,加入群聊,一起学习、一起进步
? 欢迎点赞 ? 收藏 ⭐留言 ?

一、类的加载与ClassLoader的理解

1、加载

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.class对象。

2、链接

将Java类的二进制代码合并到JVM的运行状态之中的过程。

  1. 验证:确保加载的类信息符合JVM规范,没有安全方面的问题;
  2. 准备:正式为类变量分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区内进行分配;
  3. 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。

3、初始化

  1. 执行类构造器()方法的过程。类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。
  2. 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
  3. 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步。

二、什么时候会发生类初始化

1、类的主动引用(一定会发生类的初始化)

  1. 当虚拟机启动,先初始化main方法所在的类;
  2. new一个类的对象; 调用类的静态成员(除了final常量)和静态方法;
  3. 使用java.lang.reflect包的方法对类进行反射调用;
  4. 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类;

2、类的被动调用(不会发生类的初始化)

  1. 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化;
  2. 通过数组定义类引用,不会触发此类的初始化;
  3. 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了);

三、类加载器的作用

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

四、动态创建对象执行方法

package com.reflection;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
public class Test03 { 
   
    public static void main(String[] args) throws Exception { 
   
        //获得class对象
        Class c1 = Class.forName("com.reflection.User");
        //1、构造一个对象,本质是无参构造器
        User user1 = (User) c1.newInstance();
        System.out.println(user1);
 
        //2、通过构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(int.class, String.class, int.class);
        User user2 = (User) constructor.newInstance(1,"郭一诺",1);
        System.out.println(user2);
 
        //3、通过反射调用普通方法
        User user3 = (User) c1.newInstance();
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //invoke激活
        setName.invoke(user3,"素小暖");
        System.out.println(user3.getName());
 
        //4、通过反射操作属性
        User user4 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");
        //true:取消Java语言访问检查
        name.setAccessible(true);
        name.set(user4,"素小暖2");
        System.out.println(user4.getName());
    }
}

更多用法详见:【Java基础知识 15】java反射机制原理详解

上一篇:Java零基础入门 16:java反射详解

下一篇:Java零基础入门 18:java接口

在这里插入图片描述


添加微信,备注1024,赠送Java学习路线思维导图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169726.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 二叉树(前序、中序、后序遍历图片步骤详解)

    二叉树(前序、中序、后序遍历图片步骤详解)首先我们有这么一颗二叉树:前序遍历:根结点—>左子树—>右子树这棵树的前序遍历为:ABDEGHCF中序遍历:左子树—>根结点—>右子树这棵树的前序遍历为:DBGEHACF后序遍历:左子树—>右子树—>根结点这棵树的前序遍历为:DGHEBFCA层次遍历:按层次遍历这棵树的前序遍历为:ABCDEF…

    2022年6月10日
    41
  • 什么是ESLint?「建议收藏」

    什么是ESLint?「建议收藏」在我们学习ESLint之前,我们先来了解一下什么是ESLint?什么是ESLint?官网上告诉我们,ESLint是一个用来识别ECMAScript/JavaScript并且按照规则给出报告的代码检测工具,哦,所以我们可以知道,ESLint就是一个工具,而且是一个用来检查代码的工具。代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。对大多数编程语言…

    2022年6月18日
    32
  • 指令重排详解_cpu指令重排序

    指令重排详解_cpu指令重排序指令重排:编译器指令重排,cpu指令重排,内存指令重排。编译器可能会调整顺序,如下图,左边是c++源码,右边是优化后顺序一条汇编指令的执行是可以分为很多步骤的,分为不同的硬件执行取指IF译码和取寄存器操作数ID执行或者有效地址计算EX(ALU逻辑计算单元)存储器访问MEM写回WB(寄存器)指令重排只可能发生在毫无关系的指令之间,如果指令之间存在依赖关系,则不会重排。单线程内程序的执行结果不能被改变。1原子性是指一个操作是不可中断的.

    2022年10月17日
    0
  • 计算机网络常见面试题总结

    计算机网络常见面试题总结

    2021年10月5日
    31
  • 怀揣Windows 10沙盒,放心“作死”「建议收藏」

    怀揣Windows 10沙盒,放心“作死”「建议收藏」话说,面对Windows沙盒这么好的一个功能,微软“砍刀部”这次好像格外地安静啊……

    2022年8月4日
    7
  • 贴片DO-218AB封装TVS二极管SM8T33A

    贴片DO-218AB封装TVS二极管SM8T33A提及“汽车级瞬态二极管”,大多数电子工程师都会想到DO-218AB封装SM8S系列中的SM8S24V、SM8S33A、SM8S36A、SM8S36CA等等,这些物料常用于汽车12V系统和24系统中,可通过抛负载7637-5a/5b测试,为汽车电子产品安全保驾护航。关于汽车级瞬态TVS二极管SM8T系列,知道的电子工程师并不多,但是经常有客户咨询:SM8T系列型号有哪些?SM8T33A二极管参数?SM8T36A可以替代SM8S36A吗?SM8T24CA和SM8S24CA有什么区别……瞬态二极管厂家东沃电子

    2022年9月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号