当前位置: 移动技术网 > IT编程>开发语言>Java > 荐 优秀的程序员怎么能不知道类是何时被加载进虚拟机的

荐 优秀的程序员怎么能不知道类是何时被加载进虚拟机的

2020年07月12日  | 移动技术网IT编程  | 我要评论

开始正文前,让我们先来了解一下什么是“类的动态加载机制”。当编写好一个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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网