首页 > 其他分享 >类的初始化

类的初始化

时间:2023-01-31 21:13:42浏览次数:30  
标签:初始化 System class static public out

1.导致类初始化的原因:

  1. 运行主方法所在的类,需要先完成类的初始化,再执行main方法。

    image-20230131195348681

     public class Main {
    
         static {
             System.out.println("Main.static initializer");
         }
    
         public static void main(String[] args) {
             System.out.println("Main.main");
         }
    
     }
    
  2. 第一次使用某个类的时候会进行初始化,第二次再进行new的时候就不会进行初始化。

    image-20230131195732088

     class User {
         static {
             System.out.println("User.static initializer User初始化完毕");
         }
     }
     public class Test2 {
         public static void main(String[] args) {
            new User();
            new User();
            new User();
         }
     }
    
  3. 调用某个类的静态成员(类变量和类方法 ----> 被static修饰的变量或者方法),如果此时类没有初始化则先做类的初始化再进行实例的初始化。

    image-20230131200242461

     class User {
         static {
             System.out.println("User.static initializer");
         }
         public static int a = 10;
         public static void test1() {
             System.out.println("User.test1");
         }
     }
     public class Test2 {
         public static void main(String[] args) {
             int a = User.a;
             System.out.println("a = " + a);
             User.test1();
         }
     }
    
  4. 子类初始化的时候,发现父类没初始化的时候先初始化父类。

    image-20230131200526152

     public class Test2 {
         public static void main(String[] args) {
            Zi zi = new Zi();
         }
     }
    
     class Fu {
         static {
             System.out.println("Fu.static initializer");
         }
     }
    
     class Zi extends Fu {
         static {
             System.out.println("Zi.static initializer");
         }
     }
    
  5. 通过反射操作某个类时,如果这个类没有初始化,也会倒置该类先初始化。

    image-20230131200741644

     public class Test2 {
         public static void main(String[] args) throws  Exception {
             Class<?> aClass = Class.forName("cn.lele.Fu");
             Class<?> aClass2 = Class.forName("cn.lele.Fu");
             Class<?> aClass3 = Class.forName("cn.lele.Fu");
         }
     }
    
     class Fu {
         static {
             System.out.println("Fu.static initializer");
         }
     }
    

2.哪些使用类的操作不会导致类的初始化?

  1. 使用某个类的静态常量 (static final)

    image-20230131204520415

     public class Test2 {
         public static void main(String[] args) throws Exception {
             System.out.println(Fu.MAX);
         }
     }
    
     class Fu {
    
         public static final int MAX = 999;
    
         static {
             System.out.println("Fu.static initializer");
         }
     }
    
  2. 通过子类调用父类的静态变量,静态方法,只会倒置父类的初始化,不会导致子类的初始化。即只有声明静态成员的类才会初始化。

    image-20230131204953144

     public class Test2 {
         public static void main(String[] args) throws Exception {
             Zi.test1();
         }
     }
     class Fu {
         public static int a = 10;
         public static  void test1(){
             System.out.println("Fu.test1");
         }
         public static final int MAX = 999;
         static {
             System.out.println("Fu.static initializer");
         }
     }
     class Zi extends Fu {
         static {
             System.out.println("Zi.static initializer");
         }
    
     }
    
  3. 用某个类型声明数组并创建数组对象时,不会导致这个类初始化

    image-20230131205247702

     public class Test2 {
         public static void main(String[] args) throws Exception {
             Zi[] zis = new Zi[10];
             System.out.println(zis.length);
         }
     }
     class Zi {
         static {
             System.out.println("Zi.static initializer");
         }
    
     }
    

标签:初始化,System,class,static,public,out
From: https://www.cnblogs.com/beishanqingyun/p/17080763.html

相关文章

  • 通过py脚本往model中添加初始化数据
    有时在开发的过程中,我们往往需要一些虚假的数据进行更好的代码编写。手动的一行行添加代码过于繁杂,这时通过使用脚本,就是一个很好的选择。"""初始化动态表,在动态表中添......
  • 基础篇02-macOS系统初始化
    标题:macOS系统初始化说明:主机名、硬件、软件排列等内容:1、主机名及装机历史2、硬件配置(太多机器)3、软件排列历史:2023-01-30ztFirstRelease一、macOS系统1、3个......
  • NETAPP FAS2720初始化配置
    配置前准备1.管理地址(必须)3个:1个集群管理地址,2个节点管理地址2.SP地址2个:2个底层管理地址,相当于服务器BMC地址,配置完成后可以远程进行系统重装等操作3.DNS地址:使用CIFS需......
  • 【C++ OOP 02 对象的初始化和清理】构造/析构函数、深/浅拷贝、初始化列表以及静态成
    【对象的初始化和清理】生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全C++中的面向对象来源于生活,每个对象也都会有......
  • 三种初始化及内存分析
    三种初始化及内存分析代码packagecom.zhan.base04Array;publicclassTest03{publicstaticvoidmain(String[]args){//数组的静态初始化:......
  • C++成员初始化列表比在构造函数内部赋值效率更高
    A是个类,B中包含A类的对象在执行构造函数的时候,如果内部有类对象,使用列表初始化效率会更高B中的a和b都是A的对象a是用的列表初始化b是在构造函数内部初始化a只会执行一......
  • C++指针类型的局部变量初始化
    编译器一般不会对一般变量进行初始化,当然也包括指针。所以负责初始化指针变量的只有程序员自己。使用未初始化的指针是相当危险的。因为指针直接指向内存空间,所以程序员很......
  • C/C++ 单链表的实现(初始化、插入、删除、销毁)
    #include<iostream>#include<Windows.h>#defineMAX_SIZE100usingnamespacestd;//单链表typedefstruct_LinkList{intdata;//数据域struct_LinkL......
  • gin框架分析二:gin初始化,默认配置实例构建过程
    gin的函数调用流程gin的函数调用过程大概如下图:GIN函数调用过程第一步构建GIN实例,第二步构建GIN路由,第三步则是启动http.server包,坚挺HTTP请求,并将请求处理交给gin框架......
  • 安卓请求后端初始化列表数据
    :1、首先在安卓端实现一个接口,用来接收请求,获取列表数据:publicinterfaceGetListDataInterface{@GET("/listData")Call<List<String>>getListData();}......