加载-验证-准备-解析-初始化-使用-卸载
把.class二进制数据读到内存中,并放到方法区,然后在堆中创建一个Java.lang.Class对象,这个对象就是用来封装类在方法区的数据结构的。
所以,类加载机制的最终产物是:在堆中创建了java.lang.Class对象,这个对象提供了访问方法区内部数据结构的接口。
这个主要就是验证包的签名等
为静态变量分配内存,并设置初始值。
内存分配动作发生在方法区的,在准备阶段,给类成员进行初始化。
类型 | 初始化值 |
---|---|
String | null |
Object | null |
int | 0 |
将符号引用转成直接引用
说白了,就是,将变量换成内存中真实地址,都将高级的东西解析为机器识别的底层东西。
初始化有生命类变量和静态代码块2种方式,它们的优先级相同,谁在前面谁先来。
static int age = 20;
static{
System.out.println("hello,world");
System.out.println(age);
}
package com.siyu;
public class Claloader {
static int age = 20;
static{
System.out.println("hello,world");
System.out.println(age);
}
public static void getName(){
String name = Thread.currentThread().getName();
System.out.println(name);
}
}
package com.siyu;
public class Test {
public static void main(String[] args) {
// 调用类的某个静态方法,触发类的初始化
Claloader.getName();
// hello,world
// 20
// main
}
}
package com.siyu;
public class Claloader {
static int age = 20;
static{
System.out.println("hello,world");
System.out.println(age);
}
public static void getName(){
String name = Thread.currentThread().getName();
System.out.println(name);
}
}
package com.siyu;
public class Test {
public static void main(String[] args) {
// 调用类的某个静态方法,触发类的初始化
int age = Claloader.age;
// hello,world
// 20
}
}
package com.siyu;
public class Claloader {
static int age = 20;
static{
System.out.println("hello,world");
System.out.println(age);
}
public static void getName(){
String name = Thread.currentThread().getName();
System.out.println(name);
}
}
class Sub extends Claloader{
static String name = "nezha";
static {
System.out.println("这是子类的静态代码块");
}
}
package com.siyu;
public class Test {
public static void main(String[] args) {
int age = Sub.age;
// hello,world
// 20
}
}
原文:https://www.cnblogs.com/hellosiyu/p/13127647.html