Java类何时以及如何加载和初始化?

在Java中,您首先要编写一个.java文件,然后在编译期间将其编译为.class文件。Java能够在运行时加载类。困惑是“负载”和“初始化”之间的区别是什么。Java类何时以及如何加载和初始化?通过使用下面的简单示例可以清楚地说明。
说“上课”是什么意思?
首先将C / C ++编译为本机代码,然后在编译后需要链接步骤。链接的作用是组合来自不同位置的源文件并形成可执行程序。Java不会这样做。将Java加载到JVM后,就完成了Java的类似链接步骤。
不同的JVM以不同的方式加载类,但是基本规则是仅在需要时才加载类。如果所加载的类还需要其他一些类,则它们也将被加载。加载过程是递归的。
什么时候以及如何加载Java类?
在Java中,加载策略由ClassLoader处理。以下示例显示了如何以及何时为简单程序加载类。
TestLoader.java
package compiler;public class TestLoader {
public static void main(String[] args) {
System.out.println(“test”);
}}
A.Java
package compiler;public class A {
public void method(){
System.out.println(“inside of A”);
}}
这是eclipse中的目录层次结构:

通过运行以下命令,我们可以获得有关每个已加载类的信息。“ -verbose:class”选项显示有关每个已加载类的信息。
java -verbose:class -classpath / home / ron / workspace / UltimateTest / bin /编译器.TestLoader
部分输出:

[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载sun.misc.JavaSecurityProtectionDomainAccess。
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载的java.security.ProtectionDomain $ 2]
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载的java.security.ProtectionDomain $ Key]
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载的java.security.Principal]
[从文件:/ home / xiwang / workspace / UltimateTest / bin /中加载的compiler.TestLoader。]
测试
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载java.lang.Shutdown]
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载java.lang.Shutdown $ Lock]
现在,如果我们将TestLoader.java更改为:
包 编译器; 公共 类 TestLoader {
公共 静态 void main (String [ ] args ) {
系统。出来。println (“测试” );
A a = 新 A ();
一个。方法();
} }
并再次运行相同的命令,输出将是:
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载sun.misc.JavaSecurityProtectionDomainAccess。
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载的java.security.ProtectionDomain $ 2]
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载的java.security.ProtectionDomain $ Key]
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载的java.security.Principal]
[从文件:/ home / xiwang / workspace / UltimateTest / bin /中加载的compiler.TestLoader。]
测试[从文件:/ home / xiwang / workspace / UltimateTest / bin /加载的编译器.A]
在A里面
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载java.lang.Shutdown]
[从/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加载java.lang.Shutdown $ Lock]
我们可以看到以红色突出显示的差异。A.class仅在使用时加载。总而言之,将加载一个类:
当执行新的字节码时。例如,SomeClass f = new SomeClass();
当字节码静态引用一个类时。例如,System.out。
Java类何时以及如何初始化?
首次使用类中的符号时,将初始化该类。加载类时,不会对其进行初始化。
JVM将按照文本顺序初始化超类和字段,首先初始化静态字段,最后是字段,并在初始化之前为每个字段提供默认值。
Java类实例初始化是一个示例,显示了字段,静态字段和构造函数的执行顺序。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。在这里插入图片描述

发布了252 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhaozihao594/article/details/105253268