java----类的加载与其初始化

news/2024/11/8 3:50:20/

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

http://www.ppmy.cn/news/3581.html

相关文章

SQL 语句练习03

目录 一、建表 二、插入数据 三、查询 一、建表 这里先建好我们下面查询需要的表&#xff0c;方便后续查询。 建立如下学生表(命名格式“姓名拼音_三位学号_week5s”&#xff0c; 如LBJ_023_week5s&#xff09;create table LYL_116_week5s(SNO varchar(4) primary key,SNA…

Spring WebSocket通信应用

文章目录前言一、客户端-服务端双向通信交互图二、项目说明1.引入包2.项目各模块说明问题参考前言 本文章主要记录项目客户端-服务端双向通信解决方案&#xff0c;基于Spring WebSocket架构实现双向数据通信; 以及项目实际应用中的一些问题与解决手段。一、客户端-服务端双向通…

音视频基础概念(1)——视频

目录 1.1 动画书 1.2 视频 1.3 视频帧 1.4 帧率 1.5 色彩空间 RGB与YUV YUV优势 RGB与YUV的换算 日常生活中&#xff0c;音视频随处可见&#xff0c;包括视频、音频、编解码、封装容器、音视频等概念。 1.1 动画书 连续翻动小人书&#xff0c;小人书的画面会变成一个…

[附源码]Nodejs计算机毕业设计基于博客系统的UI手机界面展示Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

深入:9种设计模式在Mybatis中的运用

虽然我们都知道有26个设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大量的设计模式&#xff0c;阅读源码并观察设计模式在其中的应用&#xff0c;能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的…

常见的四大搜索引擎区别

一般应用或网站的信息会存储在数据库中&#xff0c;而随着时间的推移&#xff0c;数据库中的信息量达到一个量级后会出现访问速度变慢的情况&#xff0c;例如用户在客户端搜索一个商品名称&#xff0c;系统可能加载了好几秒才显示数据&#xff0c;这个时候就需要进行一些优化处…

短链是什么原理?怎么实现呢?

目录一、为什么需要短链二、短链跳转访问原理三、短链生成实现方案1、自增序列算法2、Hash算法四、代码示例1、表结构及索引2、外部依赖3、Base62Utils4、DAO层5、业务层五、测试用例一、为什么需要短链 内容营销中给用户推送营销消息最常见的方式就是发短信&#xff0c;比如三…

【AI理论学习】Graph Embedding理论介绍及5种算法演示(DeepWalk)

Graph Embedding理论介绍及5种算法演示1.图数据结构2.图表示学习3.Graph Embedding3.1 DeepWalk算法DeepWalk算法理论DeepWalk 核心代码参考资料1.图数据结构 在现实世界中&#xff0c;网络只是互连节点的集合。为了表示这种类型的网络&#xff0c;我们需要一个与之相似的数据…