JDK/JRM/JVM/ClassLoader
JDK-------Java Development Kitjava程序开发工具包JRE------Java Runtime Environmentjava运行环境JVM------Java Virtual Machinejava虚拟机三者的关系类加载器双亲委派机制与官方通报同名---此时双亲委派机制保证由启动加载器加载官方的与官方不同包单同名---此时你用了这个类,那么这个类一定是安全的从下往上
JDK-------Java Development Kit
java程序开发工具包
JRE------Java Runtime Environment
java运行环境
JVM------Java Virtual Machine
java虚拟机
三者的关系
类加载器
双亲委派机制
与官方通报同名---此时双亲委派机制保证由启动加载器加载官方的
与官方不同包单同名---此时你用了这个类,那么这个类一定是安全的
从下往上:是否已经加载-----加载过直接结束类加载
从上往下:是否归我加载-----是,使用当前加载器进行加载
哪些情况会触发类加载
public class Test1 {
private static int num=10;
public static int getNum(){
return 20;
}
public static void main(String[] args){
//1.使用new关键字创建对象
Test1 test1 = new Test1();
//访问类的静态成员
//2.类名访问类的静态方法或成员变量
int a=Test1.num+10;
int b=Test1.getNum();
//3.当子类被加载的时候,其父类默认也会被加载
//4.main方法所在的类被运行时,该类第一个触发类加载
//5.使用class.forName("类路劲"”)方法指定某个类发生类加载,只发生类加载,其他啥也没干
}
}
注意的:系统类和扩展类的加载器(官方源代码)都是由启动类加载器所加载(C语言)
类加载的过程
一个类 --> 静态的源代码 静态的字节码 运行时的字节码对象
阶段一 Loading
加载阶段
阶段二 Linking
链接阶段, 分为三个步骤
- Verity 验证 ----字节码格式的校验
- Prepare 准备
为类变量(static修饰)=静态变量分配内存并设置类变量初始值 (零值),这些变量所使用的内存都将在方法区中进行分配。
此时非静态变量没有任何关系
数据类型 | 初始值 (零值) |
整型 (byte、short、int、long) | 0 |
浮点型 (float、double) | 0.0 |
字符 (char) | '\u0000' |
布尔 (boolean) | false |
引用类型 (对象或数组) | null |
- Resolve 解析
虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行。
例如:“AB”+“CD”--->"ABCD"
阶段三 Initialization-----执行 <clinit>()
方法的过程。
<clinit>()
方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。(不包括构造器中的语句。构造器是初始化对象的,类加载完成后,创建对象时候将调用的 <init>()
方法来初始化对象)
安装插件,在view中找字节码文件的show Bytecode
<clinit>()和<init>()V方法的区别
<clinit>():类成员(static)的初始化的方法
<init>()V:类的构造方法(非static方法)(初始化对象的方法)
更多推荐
所有评论(0)