详解Java中类的加载与其初始化

作者:从未止步.. 时间:2023-06-21 04:56:45 

java内存分析

详解Java中类的加载与其初始化

类加载的过程

详解Java中类的加载与其初始化

类的加载与ClassLoader的理解

详解Java中类的加载与其初始化

类的初始化

package Collections;
public class text1 {
public static void main(String[]args){
   A a=new A();
   System.out.println(A.m);
}
}
class A{
   static {
       System.out.println("A类静态代码块初始化");
       m=300;
   }
   static int m=100;
   public A(){
       System.out.println("A类的无参构造初始化");
   }
}

输出:

A类静态代码块初始化
A类的无参构造初始化
100

为什么最终输出的m值为100呢?

分析如下:

首先类进行加载和链接,如下所示:

详解Java中类的加载与其初始化

注:在链接阶段的准备工作时,编译器会为类变量赋默认值为0,即此时的m为0

链接完毕后进行类的初始化,这一过程将会执行类构造器()方法,将类中所有类变量的赋值语句以及静态代码块中的语句收集和合并:

<clinit>() {
       System.out.println("A类静态代码块初始化");
       m=300;
       m=100;
   }

第二条m的赋值语句,覆盖了第一条的300,因此最终输出为100

会发生类的初始化的场景

类的主动引用(一定会发生类的初始化)

详解Java中类的加载与其初始化

类的主动引用

package Collections;

import static Collections.Son.m;

public class text1 {
   static {
       System.out.println("Main类被加载");
   }
public static void main(String[]args) throws ClassNotFoundException {
   Son son=new Son();
}
}
class Father{
   static int a=10;
   static{
       System.out.println("Father类被加载");
   }
}
class Son extends Father{
static {
       System.out.println("子类被加载");
       m= 300;
}
   static int m =100;
   static final int M = 1;
}

输出:

Main类被加载
Father类被加载
子类被加载

反射也会产生主动引用

package Collections;

import static Collections.Son.m;

public class text1 {
   static {
       System.out.println("Main类被加载");
   }
public static void main(String[]args) throws ClassNotFoundException {
   Class.forName("Collections.Son");
}
}
class Father{
   static int a=10;
   static{
       System.out.println("Father类被加载");
   }
}
class Son extends Father{
static {
       System.out.println("子类被加载");
       m= 300;
}
   static int m =100;
   static final int M = 1;
}

输出:

Main类被加载
Father类被加载
子类被加载

类的被动引用(不会发生类的初始化)

当访问一个静态域时,只有真正声明这个域的类才会被初始化,如:当通过子类引用父类的静态变量,不会导致子类初始化。

举例:

package Collections;

import static Collections.Son.m;

public class text1 {
   static {
       System.out.println("Main类被加载");
   }
public static void main(String[]args) throws ClassNotFoundException {
   System.out.println(Son.a);
}
}
class Father{
   static int a=10;
   static{
       System.out.println("Father类被加载");
   }
}
class Son extends Father{
static {
       System.out.println("子类被加载");
       m= 300;
}
   static int m =100;
   static final int M = 1;
}

输出:

Main类被加载
Father类被加载
10

通过数组定义类引用,不会触发此类的初始化

举例:

package Collections;

import static Collections.Son.m;

public class text1 {
   static {
       System.out.println("Main类被加载");
   }
public static void main(String[]args) throws ClassNotFoundException {
   Son[] arry=new Son[5];
}
}
class Father{
   static int a=10;
   static{
       System.out.println("Father类被加载");
   }
}
class Son extends Father{
static {
       System.out.println("子类被加载");
       m= 300;
}
   static int m =100;
   static final int M = 1;
}

输出:

Main类被加载

引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)

举例:

package Collections;

import static Collections.Son.m;

public class text1 {
   static {
       System.out.println("Main类被加载");
   }
public static void main(String[]args) throws ClassNotFoundException {
   System.out.println(Son.M);
}
}
class Father{
   static int a=10;
   static{
       System.out.println("Father类被加载");
   }
}
class Son extends Father{
static {
       System.out.println("子类被加载");
       m= 300;
}
   static int m =100;
   static final int M = 1;
}

输出:

Main类被加载
1

来源:https://blog.csdn.net/m0_64365419/article/details/128320499

标签:Java,类,加载,初始化
0
投稿

猜你喜欢

  • java.nio.file.WatchService 实时监控文件变化的示例代码

    2021-10-03 01:52:53
  • Java中遍历Map集合的5种方式总结

    2023-04-29 13:14:25
  • 深入Android Handler与线程间通信ITC的详解

    2021-12-09 16:02:17
  • C++ OpenCV单峰三角阈值法Thresh_Unimodal详解

    2022-06-09 14:36:46
  • Java利用Selenium操作浏览器的示例详解

    2022-06-17 17:34:20
  • emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    2023-02-07 06:07:48
  • 解析后台进程对Android性能影响的详解

    2021-09-05 05:42:09
  • Android使用vitamio插件实现视频播放器

    2022-09-23 02:40:55
  • 详解Java Spring AOP

    2023-09-06 15:40:02
  • Android编程之SharedPreferences文件存储操作实例分析

    2023-07-18 04:07:31
  • C#对多个集合和数组的操作方法(合并,去重,判断)

    2021-12-11 14:02:44
  • Springboot-Shiro基本使用详情介绍

    2022-10-13 03:02:42
  • Java实现插入排序算法可视化的示例代码

    2021-08-06 19:35:50
  • C#实现图片上传与浏览切换的方法

    2023-10-06 06:44:05
  • java 同步器SynchronousQueue详解及实例

    2023-04-29 00:41:07
  • Java项目中获取路径的绝对路径问题和相对路径问题

    2023-07-09 13:25:01
  • Java 实战项目锤炼之网上花店商城的实现流程

    2021-09-14 04:51:45
  • Spring Boot项目集成Knife4j接口文档的实例代码

    2022-09-20 13:24:27
  • Kotlin修饰符lateinit(延迟初始化)案例详解

    2023-08-22 08:21:56
  • Android自定义TextView实现文字图片居中显示的方法

    2023-07-21 12:46:00
  • asp之家 软件编程 m.aspxhome.com