详解Java中类的加载与其初始化
作者:从未止步.. 时间:2023-06-21 04:56:45
java内存分析
类加载的过程
类的加载与ClassLoader的理解
类的初始化
package Collections;
public class text1 {
public static void main(String[]args){
A a=new A();
System.out.println(A.m);
}
}
class A{
static {
System.out.println("A类静态代码块初始化");
m=300;
}
static int m=100;
public A(){
System.out.println("A类的无参构造初始化");
}
}
输出:
A类静态代码块初始化
A类的无参构造初始化
100
为什么最终输出的m值为100呢?
分析如下:
首先类进行加载和链接,如下所示:
注:在链接阶段的准备工作时,编译器会为类变量赋默认值为0,即此时的m为0
链接完毕后进行类的初始化,这一过程将会执行类构造器()方法,将类中所有类变量的赋值语句以及静态代码块中的语句收集和合并:
<clinit>() {
System.out.println("A类静态代码块初始化");
m=300;
m=100;
}
第二条m的赋值语句,覆盖了第一条的300,因此最终输出为100
会发生类的初始化的场景
类的主动引用(一定会发生类的初始化)
类的主动引用
package Collections;
import static Collections.Son.m;
public class text1 {
static {
System.out.println("Main类被加载");
}
public static void main(String[]args) throws ClassNotFoundException {
Son son=new Son();
}
}
class Father{
static int a=10;
static{
System.out.println("Father类被加载");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
m= 300;
}
static int m =100;
static final int M = 1;
}
输出:
Main类被加载
Father类被加载
子类被加载
反射也会产生主动引用
package Collections;
import static Collections.Son.m;
public class text1 {
static {
System.out.println("Main类被加载");
}
public static void main(String[]args) throws ClassNotFoundException {
Class.forName("Collections.Son");
}
}
class Father{
static int a=10;
static{
System.out.println("Father类被加载");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
m= 300;
}
static int m =100;
static final int M = 1;
}
输出:
Main类被加载
Father类被加载
子类被加载
类的被动引用(不会发生类的初始化)
当访问一个静态域时,只有真正声明这个域的类才会被初始化,如:当通过子类引用父类的静态变量,不会导致子类初始化。
举例:
package Collections;
import static Collections.Son.m;
public class text1 {
static {
System.out.println("Main类被加载");
}
public static void main(String[]args) throws ClassNotFoundException {
System.out.println(Son.a);
}
}
class Father{
static int a=10;
static{
System.out.println("Father类被加载");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
m= 300;
}
static int m =100;
static final int M = 1;
}
输出:
Main类被加载
Father类被加载
10
通过数组定义类引用,不会触发此类的初始化
举例:
package Collections;
import static Collections.Son.m;
public class text1 {
static {
System.out.println("Main类被加载");
}
public static void main(String[]args) throws ClassNotFoundException {
Son[] arry=new Son[5];
}
}
class Father{
static int a=10;
static{
System.out.println("Father类被加载");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
m= 300;
}
static int m =100;
static final int M = 1;
}
输出:
Main类被加载
引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
举例:
package Collections;
import static Collections.Son.m;
public class text1 {
static {
System.out.println("Main类被加载");
}
public static void main(String[]args) throws ClassNotFoundException {
System.out.println(Son.M);
}
}
class Father{
static int a=10;
static{
System.out.println("Father类被加载");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
m= 300;
}
static int m =100;
static final int M = 1;
}
输出:
Main类被加载
1
来源:https://blog.csdn.net/m0_64365419/article/details/128320499
标签:Java,类,加载,初始化
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java.nio.file.WatchService 实时监控文件变化的示例代码
2021-10-03 01:52:53
![](https://img.aspxhome.com/file/2023/8/64108_0s.jpg)
Java中遍历Map集合的5种方式总结
2023-04-29 13:14:25
深入Android Handler与线程间通信ITC的详解
2021-12-09 16:02:17
![](https://img.aspxhome.com/file/2023/3/97843_0s.png)
C++ OpenCV单峰三角阈值法Thresh_Unimodal详解
2022-06-09 14:36:46
![](https://img.aspxhome.com/file/2023/6/129546_0s.png)
Java利用Selenium操作浏览器的示例详解
2022-06-17 17:34:20
![](https://img.aspxhome.com/file/2023/2/66482_0s.jpg)
emoji表情与unicode编码互转的实现(JS,JAVA,C#)
2023-02-07 06:07:48
解析后台进程对Android性能影响的详解
2021-09-05 05:42:09
Android使用vitamio插件实现视频播放器
2022-09-23 02:40:55
![](https://img.aspxhome.com/file/2023/1/137421_0s.gif)
详解Java Spring AOP
2023-09-06 15:40:02
![](https://img.aspxhome.com/file/2023/1/92641_0s.png)
Android编程之SharedPreferences文件存储操作实例分析
2023-07-18 04:07:31
![](https://img.aspxhome.com/file/2023/3/138923_0s.png)
C#对多个集合和数组的操作方法(合并,去重,判断)
2021-12-11 14:02:44
Springboot-Shiro基本使用详情介绍
2022-10-13 03:02:42
![](https://img.aspxhome.com/file/2023/2/75702_0s.png)
Java实现插入排序算法可视化的示例代码
2021-08-06 19:35:50
![](https://img.aspxhome.com/file/2023/8/81198_0s.png)
C#实现图片上传与浏览切换的方法
2023-10-06 06:44:05
java 同步器SynchronousQueue详解及实例
2023-04-29 00:41:07
Java项目中获取路径的绝对路径问题和相对路径问题
2023-07-09 13:25:01
![](https://img.aspxhome.com/file/2023/2/59902_0s.jpg)
Java 实战项目锤炼之网上花店商城的实现流程
2021-09-14 04:51:45
![](https://img.aspxhome.com/file/2023/4/108404_0s.png)
Spring Boot项目集成Knife4j接口文档的实例代码
2022-09-20 13:24:27
![](https://img.aspxhome.com/file/2023/9/125599_0s.png)
Kotlin修饰符lateinit(延迟初始化)案例详解
2023-08-22 08:21:56
![](https://img.aspxhome.com/file/2023/8/122048_0s.png)
Android自定义TextView实现文字图片居中显示的方法
2023-07-21 12:46:00
![](https://img.aspxhome.com/file/2023/0/137690_0s.gif)