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

 更新时间:2022年12月15日 09:34:47   作者:从未止步..  
这篇文章主要为大家详细介绍了Java中类的加载与其初始化的相关资料,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下

java内存分析

类加载的过程

类的加载与ClassLoader的理解

类的初始化

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呢?

分析如下:

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

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

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

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

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

会发生类的初始化的场景

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

类的主动引用

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

以上就是详解Java中类的加载与其初始化的详细内容,更多关于Java类加载与初始化的资料请关注脚本之家其它相关文章!

相关文章

  • Java 实战项目锤炼之嘟嘟健身房管理系统的实现流程

    Java 实战项目锤炼之嘟嘟健身房管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个健身房管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java中的CopyOnWriteArrayList你了解吗

    Java中的CopyOnWriteArrayList你了解吗

    CopyOnWriteArrayList是Java集合框架中的一种线程安全的List实现,这篇文章主要来和大家聊聊CopyOnWriteArrayList的简单使用,需要的可以参考一下
    2023-06-06
  • mybatis plus in方法使用详解

    mybatis plus in方法使用详解

    这篇文章主要介绍了mybatis plus in方法使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java格式化数字操作 NumberFormat及DecimalFormat

    java格式化数字操作 NumberFormat及DecimalFormat

    这篇文章主要介绍了java格式化数字操作 NumberFormat及DecimalFormat,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java工作环境的配置与Eclipse的安装过程

    Java工作环境的配置与Eclipse的安装过程

    这篇文章主要介绍了Java工作环境的配置与Eclipse的安装过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java分层概念详解

    Java分层概念详解

    这篇文章主要介绍了Java分层概念详解,内容十分详细,在这里给大家分享下,需要的朋友可以参考。
    2017-09-09
  • 解决fastjson泛型转换报错的解决方法

    解决fastjson泛型转换报错的解决方法

    这篇文章主要介绍了解决fastjson泛型转换报错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • MyBatis拦截器原理探究

    MyBatis拦截器原理探究

    MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.这篇文章主要介绍了MyBatis拦截器原理探究,需要的朋友可以参考下
    2018-02-02
  • Mybatis流式查询之ResultHanlde问题

    Mybatis流式查询之ResultHanlde问题

    这篇文章主要介绍了Mybatis流式查询之ResultHanlde问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Spring Cloud Alibaba之Sentinel实现熔断限流功能

    Spring Cloud Alibaba之Sentinel实现熔断限流功能

    这篇文章主要介绍了Spring Cloud Alibaba之Sentinel,这里使用阿里的sentinel来实现熔断限流功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论