首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么时候在java,运行时或编译时加载静态变量?

在Java中,静态变量在运行时加载。当类被加载到Java虚拟机时,静态变量会被初始化并分配内存空间。这意味着无论何时使用该类的静态变量,它们都已经被加载并准备好使用。

静态变量的加载时机可以分为两种情况:

  1. 当类被首次主动使用时:当程序第一次创建该类的实例、调用该类的静态方法、访问该类的静态变量时,会触发类的初始化,静态变量会被加载并初始化。
  2. 当类被引用时:如果一个类被其他类引用,但没有直接使用该类的静态变量或静态方法,那么该类不会被初始化,静态变量也不会被加载。

需要注意的是,静态变量只会被加载一次,无论创建多少该类的实例,静态变量都是共享的。

以下是腾讯云相关产品和产品介绍链接地址,供参考:

  1. 云服务器(CVM):提供弹性计算能力,满足各种业务需求。详情请参考:https://cloud.tencent.com/product/cvm
  2. 云数据库 MySQL 版(CDB):提供高性能、可扩展的关系型数据库服务。详情请参考:https://cloud.tencent.com/product/cdb_mysql
  3. 云原生容器服务(TKE):帮助用户快速构建、部署和管理容器化应用。详情请参考:https://cloud.tencent.com/product/tke
  4. 人工智能平台(AI Lab):提供丰富的人工智能算法和模型,支持开发者构建智能应用。详情请参考:https://cloud.tencent.com/product/ailab

请注意,以上链接仅为示例,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

四、动态创建对象执行方法 一、类的加载与ClassLoader的理解 1、加载 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.class...类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。...二、什么时候会发生类初始化 1、类的主动引用(一定会发生类的初始化) 当虚拟机启动,先初始化main方法所在的类; new一个类的对象; 调用类的静态成员(除了final常量)和静态方法; 使用java.lang.reflect...如:当通过子类引用父类的静态变量,不会导致子类初始化; 通过数组定义类引用,不会触发此类的初始化; 引用常量不会触发此类的初始化(常量链接阶段就存入调用类的常量池中了); 三、类加载器的作用 将class...文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

44420

Gradle基础知识-Wrapper,Daeman;Groovy闭包语法

jar包任务执行完任务完之后就销毁掉,下次再次构建的话还是一样的流程,由于JVM被销毁掉了,需要重新加载启动JVM然后重新加载jar包。...是gradle的版本号 Daemon什么时候会失效需要重新启动: 修改 JVM 配置这回造成启动新的构建进程 Gradle 将杀死任何闲置了3小时或更长时间的守护程序 一些环境变量的变化,如语言、keystore...)给到daemon执行 groovy语法介绍 运行在JVM上的脚本语言,强类型动态调用的 动态调用 默认Goovy是动态调用,如果加上@CommonStatic注解的话那么这段代码会像java一样进行静态编译并进行静态检查...构造方法及方法调用 Groovy的类会对其内部的所有全局变量生成一个map注入到构造方法中。...例如A类有一个a全局变量,创建A类的时候可以这样写 new A([a:1]),【】可以省略掉,new A(a:1) java方法的调用字节码是invokednamic,但是Groovy调用方法是通过

62510

Java面试题问与答——编译运行

开发和设计的时候,我们需要考虑编译运行时以及构建这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。...):你可以使用运行时或编译的注解。...Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译进行处理。到了Java 6,这个功能已经是编译器的一部分了。...编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。 面向切面的编程(Aspect Oriented Programming-AOP):切面可以在编译运行时或加载时或运行时织入。...运行时:对已经加载到JVM里的类进行织入 继承 – 发生在编译,因为它是静态的 代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。 Q.你有没有听说过“组合优于继承”这样的说法呢?

73190

JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇

编译后,运行输出。这个流程我想大家都很熟悉的。那么对应的流程应该是什么样的呢?如下图: 编辑 ​ Run的时候,先将.java文件编译成.class文件。...然后,通过类加载器,将class文件加载到JVM中,然后在运行。输出结果。 那么为什么编译好的AppTest.class可以加载到JVM中呢?可以被JVM识别呢?...JVM把class文件加载到内存后需要经历:加载-验证-准备-解析-初始化-使用-卸载这七个阶段。 第一个问题:JVM什么时候加载一个类呢?...加载的同时将加载的这些数据转换成方法区中运行时数据(运行时候数据区:静态变量静态代码块、常量池等),作为方法区数据的访问入口 这个很好理解的。我要想使用你,需要先得到你,是不是。...1.2:获取class文件的方式 可以直接从本地的磁盘文件获取 可以从忘了下载class文件 可以从ZIP或者jar等文件中 Java源文件动态编译的class文件 一个类运行生命周期内,类加载(加载获取类的二进制字节流

38320

Java 面试题问与答:编译运行时?

开发和设计的时候,我们需要考虑编译运行时以及构建这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。...):你可以使用运行时或编译的注解。...Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译进行处理。到了Java 6,这个功能已经是编译器的一部分了。...编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。 面向切面的编程(Aspect Oriented Programming-AOP):切面可以在编译运行时或加载时或运行时织入。...运行时:对已经加载到JVM里的类进行织入 继承 – 发生在编译,因为它是静态的 代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。 Q.你有没有听说过“组合优于继承”这样的说法呢?

57910

Java 面试题问与答:编译运行

开发和设计的时候,我们需要考虑编译运行时以及构建这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。...) 你可以使用运行时或编译的注解。...Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译进行处理。到了Java 6,这个功能已经是编译器的一部分了。...编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。 6、面向切面的编程(Aspect Oriented Programming-AOP) 切面可以在编译运行时或加载时或运行时织入。...6.4、运行时 对已经加载到JVM里的类进行织入 7、其他分类 继承 – 发生在编译,因为它是静态的 代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。

1.5K40

Java培训实战教程之Java基础知识精华部分(一)(二)(三)

要知道java是分两部分的:一个是编译,一个是运行。 javac: 负责的是编译的部分,当执行javac,会启动java编译器程序。...对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件,也就是java运行程序。...java: 负责运行的部分,会启动jvm,加载运行时所需的类库,并对class文件进行执行。...开发什么时候使用this呢? 定义功能,如果该功能内部使用到了调用该功能的对象,这时就用this来表示这个对象。...因为this代表对象,而静态,有可能没有对象,所以this无法使用。 4. 主函数是静态的。 什么时候定义静态成员呢?

36820

Java面试之关键字

code here } finalize()方法什么时候被调用 Java 回收该类的一个对象,就会调用这个方法。...static final相当于类常量,就是类被加载进内存的时候就要为属性分配内存,static块就是类被加载的时候执行且被执行依稀,所以可以在其中初始化 使用final关键字修饰一个变量,是引用不能变...Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。...,,只能访问静态变量,因为静态优先于对象存在,静态方法中更不可以出现this 静态变量什么时候加载?...编译期还是运行期?静态代码块加载的时机呢 静态变量是随着类的加载而执行的,JVM的代码编译运行顺序是编译、类的加载到执行,属于二者的过渡期。静态代码块也一样 成员方法是否可以访问静态变量

619100

JVM学习三

1.类文件结构 通常一个java文件,编译之后会变成字节码文件。...通常原始java代码,编译后变成字节码文件,常量信息,会放入常量池中,运行时放入到运行时常量池中。而运行常量池类似hash表,在里面可以看到里面的常量的信息。...方法字节码载入方法区,main线程开始运行,分配栈帧内存。而栈帧的数据结构是栈,先进后出的特点。接着执行引擎完成字节码操作。 在编译过程期间,会自动生成和转换一些代码,方便运行。...main方法所在的类总会被首先初始化,首次访问这个方法的静态变量静态方法,子类初始化,如果父类还没有初始化,则会子类访问父类的静态变量,触发父类的初始化。...什么时候我们会用到自定义类加载器: 1.想加载非classpath随意路径中的类文件 2.都是通过接口来使用实现,希望解耦,常用在框架设计 3.这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,

30310

第五章:面向对象编程

静态变量什么时候初始化?(什么时候开辟空间) JDK8 之后 ,静态变量存储堆内存中 类加载初始化 静态变量可以采用"引用." 来访问吗?...静态代码块加载执行 ,并且只执行一次 静态代码块可以编写多个 ,并且遵循自上而下的顺序依次执行 静态代码块什么时候使用?...Method Area(方法区):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译编译后的代码等数据。...总结:这些运行时数据区虽然功能上有所区别,但在整个 Java 虚拟机启动都需要被创建,并且虚拟机运行期间始终存在,直到虚拟机停止运行时被销毁。...组合和聚合可以获取外部对象的方法中被调用,是一种运行时关联,而继承则是一种编译关联。

9411

JVM的类加载机制

Java的动态绑定和静态绑定 Java中,当你调用一个方法,可能会在编译时期(compile time)解析(resolve),也可能实在运行时期(runtime)解析,这全取决于到底是一个静态方法...这也是我们俗称的运行时或动态绑定(runtime or dynamic binding)。...另一方面,private static和final方法将在编译解析,因为编译器知道它们不能被重写,所有可能的方法都被定义了一个类中,这些方法只能通过此类的引用变量进行调用。...这叫做静态绑定或编译绑定(static or compile time binding)。所有的private,static和final方法都通过静态绑定进行解析。...动态绑定只有重写可能存在才会用到,而重载的方法在编译时期即可确定(这是因为它们总是定义同一个类里面) 总而言之,其区别如下: ①静态绑定在编译时期,动态绑定在运行时期。

1.2K30

十个问题弄清JVM&GC(一)

JVM中核心的功能总体有三块: 类加载器:JVM启动时或运行时将需要的class文件加载到JVM中 执行引擎:负责执行class文件,包括分配运行时数据区(如程序计数器、本地方法栈和虚拟栈)和...,包括类的基本信息、常量和静态变量等等; (3)Java堆”内存上生成一个该类的java.lang.Class对象,用于对外暴露使用该类的入口。...初始化:初始化(Initialize)阶段所做的工作就是对类的静态成员变量静态方法进行初始化赋值或调用。 比如上面的静态变量age初始化之后的值变为了10。...1、方法区(Method Area):  (1)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译编译后的代码等数据; (2)方法区是各个线程共享的内存区域,虚拟机启动创建,因为同一个class...线程私有内存区加载编译某个class文件就确定了执行时需要的“程序计数器”和“虚拟栈帧”等所需的空间,并且会伴随着当前执行线程的产生而产生,执行线程的消亡而消亡,因此“线程私有内存区”并不需要考虑内存管理和垃圾回收的问题

33300

十个问题弄清JVM&GC(一)

JVM中核心的功能总体有三块: 类加载器:JVM启动时或运行时将需要的class文件加载到JVM中 执行引擎:负责执行class文件,包括分配运行时数据区(如程序计数器、本地方法栈和虚拟栈)和...“方法区”中分配一块区域保存这个类的信息,包括类的基本信息、常量和静态变量等等; (3)Java堆”内存上生成一个该类的java.lang.Class对象,用于对外暴露使用该类的入口。...具体如下图: [1595387080220043600.png] 方法区(Method Area):(1)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译编译后的代码等数据; (2)方法区是各个线程共享的内存区域...,虚拟机启动创建,因为同一个class类信息只需要加载一份就够了; (3)java虚拟机规范中把方法区描述为堆内存的一个逻辑部分,但它有另外一个别名叫“非堆”,用于与java堆区分开来。...[1595387336495059004.png] 线程私有内存区加载编译某个class文件就确定了执行时需要的“程序计数器”和“虚拟栈帧”等所需的空间,并且会伴随着当前执行线程的产生而产生,执行线程的消亡而消亡

37920

面试官:说说类加载的几个阶段

一、摘要 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件,然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。...对于“什么时候初始化”,Java 虚拟机规范有明确的规定,当符合以下条件(包括但不限),并且虚拟机在内存中没有找到对应的类信息,必须对类进行“初始化”操作: 使用new实例化对象,读取或者设置一个类的静态字段或方法...某些情况下解析阶段可以初始化阶段之后开始,这是为了支持 Java 语言的运行时绑定,也称为动态绑定或晚期绑定。...无论是哪种触发方式,虚拟机加载.class文件,都会做以下三件事情: 1.通过类的全限定名定位.class文件,并获取其二进制字节流 2.将类信息、静态变量、字节码、常量这些.class文件中的内容放入运行时数据区的方法区中...与此同时,只有当对类的主动使用的时候才会触发类的初始化,触发时机主要有以下几种场景: 1.创建类的实例对象,比如new一个对象操作 2.访问某个类或接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法

13110

全面解析JVM加载中初始化的时机

加载是把二进制字节码载入内存,验证是校验字节流中包含的信息是否符合当要求,准备是为静态变量分配内存并设置静态变量初始值,解析是把常量池内的符号引用替换为直接引用,初始化是执行所有静态变量的赋值动作和静态语句块中的语句...更多详尽分析请阅读之前的文章《JVM的类加载机制全面解析》,这里不再赘述了。 类初始化的时机 对于我们开发人员,我认为应该具体了解一下初始化阶段什么时候开始。...当使用JDK 1.7的动态语言支持,如果java.lang.invoke.MethodHandle实例最后的解析结果是REF_getStatic(使用MethodHandle读取类的静态字段)、REF_putStatic...,只有直接定义这个变量的类才会被初始化,通过子类引用父类中定义的静态变量,只会触发父类的初始化而不会触发子类的初始化,运行的结果是: 父类正在初始化 万猫学社 结果中并没有“子类正在初始化”。...只有真正使用到父接口才会被初始化,比如:引用父接口中定义的常量。 结语 这次主要分享了类什么时候被初始化,共有5种情况。除了这种5种情况的引用叫做被动引用,同时举了3个被动引用的例子。

28110

加载机制

加载机制 类的加载过程总的来说分为7个过程:加载,验证,准备,解析,初始化,使用,卸载,其中类的验证,准备,解析又称为连接阶段 java虚拟机规范并没有规定什么时候要进行加载阶段,但是规定了什么时候必须进行初始化阶段...,并将类变成二进制字节流 2,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3,在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据 的访问入口(Class...准备阶段虚拟机已经为类变量赋予初始值,初始化阶段才赋予程序员制定的值。...初始化阶段是执行类构造器<clinit>()方法的过程 <clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句源文件中出现的顺序所决定的...,静态语句块中只能访问到定义静态语句块之前的变量,定义它之后的变量,在前面的静态语句块可以赋值,但是不能访问 public class Test{ static{ i=0;//给变量赋值可以正常编译通过

38620

java基础知识总结(绝对经典)

4,javac命令和java命令做什么事情呢? 要知道java是分两部分的:一个是编译,一个是运行。 javac:负责的是编译的部分,当执行javac,会启动java编译器程序。...对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件,也就是java运行程序。...java:负责运行的部分.会启动jvm.加载运行时所需的类库,并对class文件进行执行....因为this代表对象,而静态,有可能没有对象,所以this无法使用。 4,主函数是静态的。 什么时候定义静态成员呢?或者说:定义成员,到底需不需要被静态修饰呢? 成员分两种: 1,成员变量。...细节二: 方法覆盖,注意两点: 1:子类覆盖父类,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。否则,编译失败。 2:覆盖,要么都静态,要么都不静态

64000

码仔精选,Android面试题

重载(overload)和重写(override)的区别 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译的多态性,而后者实现的是运行时的多态 性。...功能: 作为特定的标记,用于告诉编译器一些信息 编译动态处理,如动态生成代码 运行时动态处理,作为额外信息的载体,如得到注解信息 分类: 标准注解:Override、Deprecated、SuppressWarnings...自定义注解 使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。定义注解,不能继承其他的注解或接口。...类什么时候被初始化 类初始化阶段是类加载过程的最后阶段。在这个阶段,java虚拟机才真正开始执行类定义中的java程序代码。那么类什么时候会被初始化呢?...1.创建类的实例,也就是new一个对象 2.访问某个类或接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法 4.反射(Class.forName("com.example.load")) 5.初始化一个类的子类

28520

JVM之类加载阶段详解

那么什么时候(类加载的时机), 谁来加载(哪个类加载器),将哪个Class文件(Class的名称是什么)到虚拟机中呢? 1.什么时候加载?...唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量静态类型所以编译是可以确定变量静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明...而且当找不到对应的静态类型的时候还会默认对静态类型进行转换(实现接口-继承的类-进行装箱-变成一个变长类型)。 动态链接: 编译不能确认转换成哪个引用要等到运行时才可以确认调用的是哪个方法。...动态链接是和变量的实际类型相关的,因为变量的实际类型不能够在编译确定只能等到运行时才可以,比如某个条件成立就将这个变量转换为A,不成立转为B(前提这个条件的成立与否必须是运行时才可以确定的,不能够在编译就能够确认比如...只要一个类被虚拟机加载进方法区,那么堆中就会有一个代表该类的对象:java.lang.Class。这个对象类被加载进方法区的时候创建,方法区中该类被删除清除。

67210

反射

反射 IT那个小笔记 类的加载时机 类加载器 什么是反射 通过字节码来使用 越过数组泛型检测 类的加载时机 当程序要使用某个类,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化...连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 初始化 初始化成员变量等等 类什么时候会被加载 创建类的实例 调用类的静态方法、访问静态变量...虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。 类加载器分类 根类加载器 也被称为引导类加载器,负责Java核心类的加载 比如System,String等。...JDK中JRE的lib目录下ext目录 系统类加载器 负责JVM启动加载来自java命令的class文件 以及classpath环境变量所指定的jar包和类路径 什么是反射 创建一个对象的三个阶段...,不能去编译 但我们知道泛型,实际上字节码中并不存在 仅仅是在编译中的语法,让你遵守不能添加别的 在运行时实际上并没有规定,只是你这样写了不然通不过编译 所以我们可以通过获取字节码来跨过泛型

48010
领券