在Java中,静态变量在运行时加载。当类被加载到Java虚拟机时,静态变量会被初始化并分配内存空间。这意味着无论何时使用该类的静态变量,它们都已经被加载并准备好使用。
静态变量的加载时机可以分为两种情况:
需要注意的是,静态变量只会被加载一次,无论创建多少该类的实例,静态变量都是共享的。
以下是腾讯云相关产品和产品介绍链接地址,供参考:
请注意,以上链接仅为示例,具体产品选择应根据实际需求进行评估和决策。
四、动态创建对象执行方法 一、类的加载与ClassLoader的理解 1、加载 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.class...类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。...二、什么时候会发生类初始化 1、类的主动引用(一定会发生类的初始化) 当虚拟机启动,先初始化main方法所在的类; new一个类的对象; 调用类的静态成员(除了final常量)和静态方法; 使用java.lang.reflect...如:当通过子类引用父类的静态变量,不会导致子类初始化; 通过数组定义类引用,不会触发此类的初始化; 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了); 三、类加载器的作用 将class...文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。
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调用方法是通过
,编译后,运行输出。这个流程我想大家都很熟悉的。那么对应的流程应该是什么样的呢?如下图: 编辑 在Run的时候,先将.java文件编译成.class文件。...然后,在通过类加载器,将class文件加载到JVM中,然后在运行。输出结果。 那么为什么编译好的AppTest.class可以加载到JVM中呢?可以被JVM识别呢?...JVM把class文件加载到内存后需要经历:加载-验证-准备-解析-初始化-使用-卸载这七个阶段。 第一个问题:JVM在什么时候会加载一个类呢?...加载的同时将加载的这些数据转换成方法区中运行时数据(运行时候数据区:静态变量、静态代码块、常量池等),作为方法区数据的访问入口 这个很好理解的。我要想使用你,需要先得到你,是不是。...1.2:获取class文件的方式 可以直接从本地的磁盘文件获取 可以从忘了下载class文件 可以从ZIP或者jar等文件中 Java源文件动态编译的class文件 在一个类运行生命周期内,类加载(加载获取类的二进制字节流
在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。...):你可以使用运行时或者编译时的注解。...在Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译时进行处理。到了Java 6,这个功能已经是编译器的一部分了。...编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。 面向切面的编程(Aspect Oriented Programming-AOP):切面可以在编译时,运行时或,加载时或者运行时织入。...运行时:对已经加载到JVM里的类进行织入 继承 – 发生在编译时,因为它是静态的 代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。 Q.你有没有听说过“组合优于继承”这样的说法呢?
在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。...) 你可以使用运行时或者编译时的注解。...在Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译时进行处理。到了Java 6,这个功能已经是编译器的一部分了。...编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。 6、面向切面的编程(Aspect Oriented Programming-AOP) 切面可以在编译时,运行时或,加载时或者运行时织入。...6.4、运行时 对已经加载到JVM里的类进行织入 7、其他分类 继承 – 发生在编译时,因为它是静态的 代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。
要知道java是分两部分的:一个是编译,一个是运行。 javac: 负责的是编译的部分,当执行javac时,会启动java的编译器程序。...对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件,也就是java的运行程序。...java: 负责运行的部分,会启动jvm,加载运行时所需的类库,并对class文件进行执行。...开发时,什么时候使用this呢? 在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用this来表示这个对象。...因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。 4. 主函数是静态的。 什么时候定义静态成员呢?
静态变量在什么时候初始化?(什么时候开辟空间) JDK8 之后 ,静态变量存储在堆内存中 类加载时初始化 静态变量可以采用"引用." 来访问吗?...静态代码块在类加载时执行 ,并且只执行一次 静态代码块可以编写多个 ,并且遵循自上而下的顺序依次执行 静态代码块什么时候使用?...Method Area(方法区):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。...总结:这些运行时数据区虽然在功能上有所区别,但在整个 Java 虚拟机启动时都需要被创建,并且在虚拟机运行期间始终存在,直到虚拟机停止运行时被销毁。...组合和聚合可以在获取外部对象的方法中被调用,是一种运行时关联,而继承则是一种编译时关联。
code here } finalize()方法什么时候被调用 Java 回收该类的一个对象时,就会调用这个方法。...static final相当于类常量,就是在类被加载进内存的时候就要为属性分配内存,static块就是类被加载的时候执行且被执行依稀,所以可以在其中初始化 使用final关键字修饰一个变量时,是引用不能变...Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。...,,只能访问静态变量,因为静态优先于对象存在,静态方法中更不可以出现this 静态变量在什么时候加载?...编译期还是运行期?静态代码块加载的时机呢 静态变量是随着类的加载而执行的,JVM的代码编译运行顺序是编译、类的加载到执行,属于二者的过渡期。静态代码块也一样 成员方法是否可以访问静态变量?
1.类文件结构 通常一个java文件,编译之后会变成字节码文件。...通常原始java代码,编译后变成字节码文件,常量信息,会放入常量池中,运行时放入到运行时常量池中。而运行常量池类似hash表,在里面可以看到里面的常量的信息。...方法字节码载入方法区,main线程开始运行,分配栈帧内存。而栈帧的数据结构是栈,先进后出的特点。接着执行引擎完成字节码操作。 在编译过程期间,会自动生成和转换一些代码,方便运行。...main方法所在的类总会被首先初始化,首次访问这个方法的静态变量或静态方法,子类初始化,如果父类还没有初始化,则会子类访问父类的静态变量,触发父类的初始化。...什么时候我们会用到自定义类加载器: 1.想加载非classpath随意路径中的类文件 2.都是通过接口来使用实现,希望解耦时,常用在框架设计 3.这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,
众所周知,高级编程语言编写的程序,最终要转化为机器码,才可以在计算机上运行。我们在编写完一段Java代码后,如果想要运行它,需要通过Java编译器,将其编译为JVM认识的字节码文件。...验证完成后,在方法区为类的静态变量分配内存并设置默认值。紧接着,将常量池中表示对象的符号引用,指向到实际的内存地址,也就是直接引用。什么是符号引用呢?...最后执行静态代码块,为静态变量设置初始值,类加载工作就算完成了。整个加载过程就是面试被经常问到的类加载机制。那么问题来了:静态变量为什么要先设置默认值,再设置初始值,知道的评论区留言。...在程序启动时,解释器可以立即发挥作用,省去编译时间;随着程序运行时间的推移,JIT编译器逐渐发挥作用,将越来越多的热点代码编译为本地机器码,以提高执行效率。Main方法什么时候被执行?...执行静态变量赋值的指令时,会把整数推送到栈帧中的操作数栈,随后赋值给静态变量。在执行创建一个Object实例的指令时,如果Object Class未被加载,类加载器会启动加载过程。
Java的动态绑定和静态绑定 在Java中,当你调用一个方法时,可能会在编译时期(compile time)解析(resolve),也可能实在运行时期(runtime)解析,这全取决于到底是一个静态方法...这也是我们俗称的运行时或动态绑定(runtime or dynamic binding)。...另一方面,private static和final方法将在编译时解析,因为编译器知道它们不能被重写,所有可能的方法都被定义在了一个类中,这些方法只能通过此类的引用变量进行调用。...这叫做静态绑定或编译时绑定(static or compile time binding)。所有的private,static和final方法都通过静态绑定进行解析。...动态绑定只有在重写可能存在时才会用到,而重载的方法在编译时期即可确定(这是因为它们总是定义在同一个类里面) 总而言之,其区别如下: ①静态绑定在编译时期,动态绑定在运行时期。
JVM中核心的功能总体有三块: 类加载器:在JVM启动时或者在类运行时将需要的class文件加载到JVM中 执行引擎:负责执行class文件,包括分配运行时数据区(如程序计数器、本地方法栈和虚拟栈)和...,包括类的基本信息、常量和静态变量等等; (3)在“Java堆”内存上生成一个该类的java.lang.Class对象,用于对外暴露使用该类的入口。...初始化:初始化(Initialize)阶段所做的工作就是对类的静态成员变量和静态方法进行初始化赋值或调用。 比如上面的静态变量age初始化之后的值变为了10。...1、方法区(Method Area): (1)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据; (2)方法区是各个线程共享的内存区域,在虚拟机启动时创建,因为同一个class...线程私有内存区在类加载器编译某个class文件时就确定了执行时需要的“程序计数器”和“虚拟栈帧”等所需的空间,并且会伴随着当前执行线程的产生而产生,执行线程的消亡而消亡,因此“线程私有内存区”并不需要考虑内存管理和垃圾回收的问题
类加载机制 类的加载过程总的来说分为7个过程:加载,验证,准备,解析,初始化,使用,卸载,其中类的验证,准备,解析又称为连接阶段 java虚拟机规范并没有规定什么时候要进行加载阶段,但是规定了什么时候必须进行初始化阶段...,并将类变成二进制字节流 2,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3,在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据 的访问入口(Class...在准备阶段虚拟机已经为类变量赋予初始值,在初始化阶段才赋予程序员制定的值。...初始化阶段是执行类构造器<clinit>()方法的过程 <clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的...,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问 public class Test{ static{ i=0;//给变量赋值可以正常编译通过
一、摘要 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件,然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。...对于“什么时候初始化”,Java 虚拟机规范有明确的规定,当符合以下条件时(包括但不限),并且虚拟机在内存中没有找到对应的类信息,必须对类进行“初始化”操作: 使用new实例化对象时,读取或者设置一个类的静态字段或方法时...在某些情况下解析阶段可以在初始化阶段之后开始,这是为了支持 Java 语言的运行时绑定,也称为动态绑定或晚期绑定。...无论是哪种触发方式,虚拟机在加载.class文件时,都会做以下三件事情: 1.通过类的全限定名定位.class文件,并获取其二进制字节流 2.将类信息、静态变量、字节码、常量这些.class文件中的内容放入运行时数据区的方法区中...与此同时,只有当对类的主动使用的时候才会触发类的初始化,触发时机主要有以下几种场景: 1.创建类的实例对象,比如new一个对象操作 2.访问某个类或接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法
JVM中核心的功能总体有三块: 类加载器:在JVM启动时或者在类运行时将需要的class文件加载到JVM中 执行引擎:负责执行class文件,包括分配运行时数据区(如程序计数器、本地方法栈和虚拟栈)和...“方法区”中分配一块区域保存这个类的信息,包括类的基本信息、常量和静态变量等等; (3)在“Java堆”内存上生成一个该类的java.lang.Class对象,用于对外暴露使用该类的入口。...具体如下图: [1595387080220043600.png] 方法区(Method Area):(1)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据; (2)方法区是各个线程共享的内存区域...,在虚拟机启动时创建,因为同一个class类信息只需要加载一份就够了; (3)java虚拟机规范中把方法区描述为堆内存的一个逻辑部分,但它有另外一个别名叫“非堆”,用于与java堆区分开来。...[1595387336495059004.png] 线程私有内存区在类加载器编译某个class文件时就确定了执行时需要的“程序计数器”和“虚拟栈帧”等所需的空间,并且会伴随着当前执行线程的产生而产生,执行线程的消亡而消亡
加载是把二进制字节码载入内存,验证是校验字节流中包含的信息是否符合当要求,准备是为静态变量分配内存并设置静态变量初始值,解析是把常量池内的符号引用替换为直接引用,初始化是执行所有静态变量的赋值动作和静态语句块中的语句...更多详尽分析请阅读之前的文章《JVM的类加载机制全面解析》,这里不再赘述了。 类初始化的时机 对于我们开发人员,我认为应该具体了解一下初始化阶段什么时候在开始。...当使用JDK 1.7的动态语言支持时,如果java.lang.invoke.MethodHandle实例最后的解析结果是REF_getStatic(使用MethodHandle读取类的静态字段)、REF_putStatic...,只有直接定义这个变量的类才会被初始化,通过子类引用父类中定义的静态变量,只会触发父类的初始化而不会触发子类的初始化,运行的结果是: 父类正在初始化 万猫学社 结果中并没有“子类正在初始化”。...只有在真正使用到父接口时才会被初始化,比如:引用父接口中定义的常量。 结语 这次主要分享了类在什么时候被初始化,共有5种情况。除了这种5种情况的引用叫做被动引用,同时举了3个被动引用的例子。
4,javac命令和java命令做什么事情呢? 要知道java是分两部分的:一个是编译,一个是运行。 javac:负责的是编译的部分,当执行javac时,会启动java的编译器程序。...对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件,也就是java的运行程序。...java:负责运行的部分.会启动jvm.加载运行时所需的类库,并对class文件进行执行....因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。 4,主函数是静态的。 什么时候定义静态成员呢?或者说:定义成员时,到底需不需要被静态修饰呢? 成员分两种: 1,成员变量。...细节二: 在方法覆盖时,注意两点: 1:子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。否则,编译失败。 2:覆盖时,要么都静态,要么都不静态。
重载(overload)和重写(override)的区别 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态 性。...功能: 作为特定的标记,用于告诉编译器一些信息 编译时动态处理,如动态生成代码 运行时动态处理,作为额外信息的载体,如得到注解信息 分类: 标准注解:Override、Deprecated、SuppressWarnings...自定义注解 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。...类什么时候被初始化 类初始化阶段是类加载过程的最后阶段。在这个阶段,java虚拟机才真正开始执行类定义中的java程序代码。那么类什么时候会被初始化呢?...1.创建类的实例,也就是new一个对象 2.访问某个类或接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法 4.反射(Class.forName("com.example.load")) 5.初始化一个类的子类
目录 一、JVM相关概念汇总 1、JVM内存图 2、JVM类加载器 3、双亲委派模型 4、堆 5、GC 6、栈 二 、JVM面试总结 1、Java运行时,一个类是什么时候被加载的 2、JVM 一个类的加载过程...引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。...Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。...二 、JVM面试总结 1、Java运行时,一个类是什么时候被加载的 1.1 类是通过什么加载的?...父类–静态变量 父类–静态初始化块 子类–静态变量 子类–静态初始化块 父类–变量 父类–初始化块 父类–构造器 子类–变量 子类–初始化块 子类–构造器 4、JVM中不同的类加载器加载哪些文件
领取专属 10元无门槛券
手把手带您无忧上云