java 理论基础 类的初始化(加载、连接(验证、准备、解析)、初始化)
一个进程就有一个JVM,每个进程之间资源独立
package com.zmd.jvm;
public class A {
public static int a = 5;
}
多个进行并发运行类
package com.zmd.jvm;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
A.a ++;
System.out.println("A.a" + A.a);
Thread.sleep(10000);
}
}
可以看到Test1同时运行多个进程,每个输出的A.a都是6
***类加载连接和初始化***
1,类的加载:
- 从本地文件系统加载class文件,这是前面绝大部分示例程序的类加载方式
- 从JAR包加载class文件,这种方式也是很常见的,比如我们使用JDBC时用到的数据库驱动类就放在JAR文件中,JVM 可以从JAR文件中直接加载该class文件
- 通过网络加载class文件
- 把Java源文件动态编译,并执行加载
2,类的连接:
(1),验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致,保证类在运行的时候不会有问题。
(2),准备:类准备阶段则负责为类的类变量分配内存,并设置默认初始值。(static int i=5,准备阶段会赋值0.再在初始化阶段赋值5)
(3),解析:将类的二进制数据中的符号引用替换成内存地址指针直接引用
3,类的初始化:
public class Test {
private static int a = 5;
private static int b = 8;
private static int c = 9;
static {
b = 6;
c = 7;
}
public static void main(String[] args) {
System.out.println(a + ", " + b + ", " + c);
}
}
package com.vgxit.jvm;
public class Test {
static {
b = 6;
c = 7;
}
private static int a = 5;
private static int b = 8;
private static int c = 9;
public static void main(String[] args) {
System.out.println(a + ", " + b + ", " + c);
}
}
什么时候初始化:
当遇到下面几种情况,就会执行初始化:
例外情况!:
public class ClassInitTest {
private static class TestAAA {
static {
System.out.println("我是初始化块");
}
public static final String text = "V哥好帅";
}
public static void main(String[] args) {
System.out.println(TestAAA.text);
}
}
只输出了“V哥好帅”
面试答法:
编译优化 : --->
对于类变量,如果该类变量的值在编译的时候就可以确定下来,(如final类型的后面运行中不能更改)。Java编译器在编译的时候,就会产生代码优化,编译器会直接把这个类变量出现的地方全部替换成对应的值(比如上面例子中的“V哥好帅”)。
因此我们上面这个程序从我们程序员写代码的角度看上去使用到了TestAAA的text类变量,但是其实运行时根本就没有用到。所以这个时候就没有发生直观看到被调用类的初始化,所以我们的静态初始化块压根就不会运行。
如果不是final类型的变量,比如把上面的类变量final去掉
public static String text = "V哥好帅";
输出为:
我是初始化块
V哥好帅
java 理论基础 类的初始化(加载、连接(验证、准备、解析)、初始化)的更多相关文章
- 【译】12. Java反射——类的动态加载和重新加载
原文地址:http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html 博主最近比较忙,争取每周翻译 ...
- [改善Java代码]使用forName动态加载类文件
动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...
- Java类编译、加载、和执行机制
Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...
- JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException
我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...
- Java类加载机制(加载、验证、准备、解析、初始化)
如下图所示,Java的类加载机制主要分为三个部分,分别为加载.链接.初始化.其中链接又分为三个小部分--验证.准备.解析. 加载--在经过对Java代码进行编译后,JVM将Java类编译后的二进制文件 ...
- java类什么时候加载?,加载类的原理机制是怎么样的?
java类什么时候加载?,加载原理机制是怎么样的? 答: 很多人都不是很清楚java的class类什么时候加载在运行内存中,其实类加载的时间是发生在一下几种情况: 1.实例化对象时,就像sprin ...
- java动态编译类文件并加载到内存中
如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- java reflect 初始学习 动态加载类
首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...
随机推荐
- 关于Jmeter线程组的设置,看这一篇就够了
一.事件背景 个人感觉自己做性能测试,可以说是轻车熟路了,而且工作多年一直都是这一套测试思路及体系,从未质疑过自己,也许是狮子座的迷之自信吧! 也就在上周让我对自己的测试方法及体系产生了质疑! 为什么 ...
- CF1278F Cards
CF1278F Cards 首先我们知道,一次拿牌的概率是 $ P(i) = \frac 1 m $ ,同时权值是1,所以期望就是 $ \frac{1} m $,拿 $ n $ 次牌贡献是独立的,就是 ...
- Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)
Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的 D1E 罢--虽然我不会做/kk u1s1 似乎这场 Div1 挺水的?F 就是个 AC 自动机板子还被评到了 3k2-- ...
- #10470. 「2020-10-02 提高模拟赛」流水线 (line)
题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...
- char *p、char p[]、字符串的几个题目
总结一下遇到的关于char *p.char p[]和字符串的题目: 例一:(指针的指针) 1 void getmemory(char **p) 2 { 3 p = (char *)malloc(100 ...
- 解决 Ubuntu 下 gedit编辑器打开文件出现中文乱码问题
解决 Ubuntu 中 gedit编辑器打开文件出现中文乱码问题 1. 问题分析 在 windows 系统下,.txt 文件默认编码方式为 gb18030 格式的中文编码,而 gedit 默认的编码方 ...
- R语言与医学统计图形【6】低级绘图函数
R语言基础绘图系统 基础绘图包之低级绘图函数--定义坐标轴.图例.文本 低级绘图函数:本身不具备图形绘制能力,只是在已有图形基础上添加元素. 函数 功能 arrows 添加箭头 axis 坐标轴 bo ...
- 云原生PaaS平台通过插件整合SkyWalking,实现APM即插即用
一. 简介 SkyWalking 是一个开源可观察性平台,用于收集.分析.聚合和可视化来自服务和云原生基础设施的数据.支持分布式追踪.性能指标分析.应用和服务依赖分析等:它是一种现代 APM,专为云原 ...
- Redis | 第11章 服务器的复制《Redis设计与实现》
目录 前言 1. 旧版复制功能的实现 1.1 同步与命令传播 1.2 旧版复制功能的缺陷 2. 新版复制功能的实现 2.1 部分重同步的实现原理 3. PSYNC 命令的实现 4. 复制的详细步骤 4 ...
- 【1】Embarrassingly Parallel(易并行计算问题)
1.什么是Embarrassingly Parallel(易并行计算问题) 易并行计算问题:A computation that can be divided into a number of co ...