荐 优秀的程序员怎么能不知道类是何时被加载进虚拟机的
开始正文前,让我们先来了解一下什么是“类的动态加载机制”。当编写好一个java类并通过编译器编译成class文件后,该类就可以在JVM虚拟机中运行了。我们将,class文件被加载到虚拟机中的过程称为“类加载机制”。“动态加载”就是在程序运行的过程中将class文件加载到虚拟机中。
我们都知道java可以做到运行时动态加载类,那你知道,编写好的类是什么时候加载到java虚拟机中的吗?
下面就让我们就一起探讨一下,java类在什么情况下会被加载到JVM虚拟机中。
首先让我们先将idea作出如下配置(我使用的开发工具是idea,所以只介绍了idea的配置),从而方便我们观察类是何时被加载的。
操作步骤请按如下两图进行:
第一种情况:
当我们通过“new”关键字创建出一个对象实例时,会将该类加载到虚拟机中。
代码:
public class Test {
public static void main(String[] args) {
// 通过new关键字创建A类的实例。
A a = new A();
}
}
// A类
public class A {
}
类的加载情况:
第二种情况:
当我们访问一个类的静态方法或者静态属性时,会将该类加载至虚拟机中。
代码:
public class Test {
public static void main(String[] args) {
String name = A.name;
B.show();
}
}
// A类
public class A {
public static String name = "小菜鸟";
}
// B类
public class B {
public static void show (){
System.out.println("调用类的静态方法导致类加载!");
}
}
类的加载情况:
当初始化一个类的时候会初始化该类的静态代码块,如果这其中有引用到其它类,那么被引用的类也会进行加载。
代码:
public class Test {
public static void main(String[] args) {
A a = new A();
}
}
// A类
class A {
// 静态代码块
static {
B b = new B();
}
}
// B类
class B {
}
类的加载情况:
第三种情况:
通过反射(使用Class.forName()方法),也会导致类加载。
代码:
public class Test {
public static void main(String[] args) {
try {
Class<?> a = Class.forName("articlecode.classloading.A");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
// A类
class A {
}
类的加载情况:
第四种情况:
当加载子类时,会先加载它的父类。
代码:
public class Test {
public static void main(String[] args) {
A a = new A();
}
}
// A类
class A extends B{
}
// B类
class B {
}
类的加载情况:
以上四种情况都会将类加载进虚拟机中。类的加载有且仅有“一次”,当一个类已经在虚拟机中存在了,就不会再进行重复加载了。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
本文地址:https://blog.csdn.net/first_M/article/details/107286563
上一篇: C#警惕匿名方法造成的变量共享实例分析
下一篇: 闲下来想一想