小白日更第三十八天->类初始化时机

news/2024/5/19 6:40:02 标签: java, 反射, jvm

什么时候会发生类的初始化

1、创建类的实例,也就是new一个对象
2、访问某个类或接口的静态变量,或者对该静态变量赋值
3、调用类的静态方法
4、反射(Class.forName(“com.qcby.***”))
5、初始化一个类的子类(会首先初始化子类的父类)
6、JVM启动时标明的启动类,即文件名和类名相同的那个类
 测试:

创建类的实例,也就是new一个对象

java">package com.qcby.algorithm;

public class Test01 {
    public static void main(String[] args) {
        A a = new A();
    }
}
class A{
    A(){
        System.out.println("执行构造函数");
    }
    {
        System.out.println("执行代码块");
    }
    static {
        System.out.println("执行静态代码块");
    }
}

运行结果在这里插入图片描述
完善一下:

java">package com.qcby.algorithm;

public class Test01 {
    static {
        System.out.println("main所在的类进行初始化");
    }
    public static void main(String[] args) {
        B b = new B();
    }
}
class A{
    static int a;
    A(){
        System.out.println("父类执行构造函数");
    }
    {
        System.out.println("父类执行代码块");
    }
    static {
        System.out.println("父类执行静态代码块");
        a=10;
    }
}
class B extends A{
    static int b;
    B(){
        System.out.println("子类执行构造函数");
    }
    {
        System.out.println("子类执行代码块");
    }
    static {
        System.out.println("子类执行静态代码块");
        b=100;
    }
}

结果:
在这里插入图片描述
从运行结果我们可以看出当JVM虚拟机启动,先初始化main方法所在的类。当我么在new 一个类的对象,如果其父类没有被初始化,则会先初始化他的父类。加载顺序也一目了然了。先加载父类static代码块,然后是子类static代码块,然后是父类代码块,构造函数。子类代码块,构造函数。

访问某个类或接口的静态变量,或者对该静态变量赋值

java">package com.qcby.algorithm;

public class Test01 {
    static {
        System.out.println("main所在的类进行初始化");
    }
    public static void main(String[] args) {
        System.out.println(B.b);
//        System.out.println(B.b = 1);


    }
}
class A{
    static int a;
    A(){
        System.out.println("父类执行构造函数");
    }
    {
        System.out.println("父类执行代码块");
    }
    static {
        System.out.println("父类执行静态代码块");
        a=10;
    }
}
class B extends A{
    static int b;
    B(){
        System.out.println("子类执行构造函数");
    }
    {
        System.out.println("子类执行代码块");
    }
    static {
        System.out.println("子类执行静态代码块");
        b=100;
    }
}

代码运行结果
在这里插入图片描述
给静态变量复制的操作我在这里就不演示了哈,小伙伴们自己

调用类的静态方法

java">package com.qcby.algorithm;

public class Test01 {
    static {
        System.out.println("main所在的类进行初始化");
    }
    public static void main(String[] args) {
        A.study();
    }
}
class A{
    static int a;
    A(){
        System.out.println("父类执行构造函数");
    }
    {
        System.out.println("父类执行代码块");
    }
    static {
        System.out.println("父类执行静态代码块");
        a=10;
    }
    public static void study(){
        System.out.println("好好学习!");
    }
}

运行结果
在这里插入图片描述

反射(Class.forName(“com.qcby.***”))

java">package com.qcby.algorithm;

public class Test01 {
    static {
        System.out.println("main所在的类进行初始化");
    }
    public static void main(String[] args) throws Exception{
        Class<?> aClass = Class.forName("com.qcby.algorithm.B");
    }
}
class A{
    static int a;
    A(){
        System.out.println("父类执行构造函数");
    }
    {
        System.out.println("父类执行代码块");
    }
    static {
        System.out.println("父类执行静态代码块");
        a=10;
    }
    public static void study(){
        System.out.println("好好学习!");
    }
}
class B extends A{
    static int b;
    B(){
        System.out.println("子类执行构造函数");
    }
    {
        System.out.println("子类执行代码块");
    }
    static {
        System.out.println("子类执行静态代码块");
        b=100;
    }
}

一个注意点,要抛出一个异常,不然会报错

java: 未报告的异常错误java.lang.ClassNotFoundException; 必须对其进行捕获或声明以便抛出

很好理解,人家怎么知道你到底有没有这个类,要是没有就会抛出ClassNotFoundException。

当通过子类引用父类的静态变量,不会导致子类初始化

java">package com.qcby.algorithm;

public class Test01 {
    static {
        System.out.println("main所在的类进行初始化");
    }
    public static void main(String[] args) {
       B.a=666;
    }
}
class A{
    static int a;
    A(){
        System.out.println("父类执行构造函数");
    }
    {
        System.out.println("父类执行代码块");
    }
    static {
        System.out.println("父类执行静态代码块");
        a=10;
    }
    public static void study(){
        System.out.println("好好学习!");
    }
}
class B extends A{
    static int b;
    B(){
        System.out.println("子类执行构造函数");
    }
    {
        System.out.println("子类执行代码块");
    }
    static {
        System.out.println("子类执行静态代码块");
        b=100;
    }
}

运行结果
在这里插入图片描述

通过数组定义类引用,和引用类的常量(不会会发生类的初始化)

java">package com.qcby.algorithm;

public class Test01 {
    static {
        System.out.println("main所在的类进行初始化");
    }
    public static void main(String[] args) {
       //通过数组定义类引用
        B[]b=new B[10];
        //调用静态常量
        System.out.println(B.NUMBER);
    }
}
class A{
    static int a;
    A(){
        System.out.println("父类执行构造函数");
    }
    {
        System.out.println("父类执行代码块");
    }
    static {
        System.out.println("父类执行静态代码块");
        a=10;
    }
    public static void study(){
        System.out.println("好好学习!");
    }
}
class B extends A{
    static final int NUMBER=666;
    int b=100;
    B(){
        System.out.println("子类执行构造函数");
    }
    {
        System.out.println("子类执行代码块");
    }
    static {
        System.out.println("子类执行静态代码块");
    }
}

运行结果:
在这里插入图片描述
有什么问题希望小伙伴们在评论区积极留言~
在这里插入图片描述


http://www.niftyadmin.cn/n/1276711.html

相关文章

ShardingSphere基本介绍及核心概念

文章目录 关于分库分表 背景描述遇到的问题如何解决 垂直拆分水平拆分(数据分片) ShardingSphere介绍Sharding-JDBC Sharding-JDBC主要功能&#xff1a;Sharding-JDBC 内部结构&#xff1a;Sharding-JDBC初始化流程&#xff1a;Sharding-JDBC 使用过程&#xff1a; ShardingS…

转载:手把手教你做iOS推送

手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html

sheetJs+xlsx-style——前端实现导出excel表格——设置单元格背景色,居中,自动换行,宽度,百分数展示等

之前写过一篇博客&#xff0c;是关于elementUi—table组件xlsx插件实现导出——sheetJs的&#xff0c;之前实现的功能有&#xff1a; 根据dom获取内容创建工作簿调整单元格的宽度实现百分数的展示插入到工作表中导出到浏览器中 博客地址如下&#xff1a; elementUi—table组件…

Winform、WPF、Silverlight、MFC区别与联系

WinForm 在Windows中&#xff0c;诸如窗体绘制等功能由GDI&#xff08;图形设备接口&#xff09;实现&#xff0c;放在操作系统内核中。Windows Forms在底层使用的是GDI。GDI是GDI的“面向对象包装”&#xff0c;使用C实现。.NET Windows Forms应用程序中使用的GDI其实是在C实现…

小白日更第三十九天->静态变量什么时候被回收

要想真正的知道这个问题的答案&#xff0c;需要一点jvm的基础。 静态变量什么时候分配 静态变量是在类初始化之前就在方法去的静态域中分配内存空间了。 静态变量在类被卸载的时候销毁。 那什么时候类卸载呢&#xff1f; 在<深入理解Java虚拟机&#xff1a;JVM高级特性与…

Shiro框架-史上详解

Shiro 1.权限管理概述 2.Shiro权限框架 2.1 概念 2.2 Apache Shiro 与Spring Security区别 3.Shiro认证 3.1 基于ini认证 3.2 自定义Realm --认证 4.Shiro授权 4.1 基于ini授权 4.2 自定义realm – 授权 5.项目集成shiro 认证-授权注意点 5.1 认证 5.2 授权 5.3 注解Requi…

AccessRandomFile多线程下载文件

写一个工具类 package com.pb.thread.demo;import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile;/*** 多线程复制文件工具类* * author denny**/ public class MutiCopyFileUtil {private String src;//…

小白日更第四十天->GC Roots的对象

关于这个问题好像查的人还不少&#xff0c;网上的说法也不是很统一&#xff0c;我直接在<深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09; 周志明>这本书中来给大家找到答案吧 在Java技术体系里面&#xff0c; 固定可作为GC Roots的对…