zoukankan      html  css  js  c++  java
  • 反射(分析类初始化)

    什么时候会发生类初始化:
    1)new的时候

    2)使用反射的时候

    3)当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类

    测试:

     1 package reflection;
     2 
     3 
     4 import org.w3c.dom.ls.LSOutput;
     5 
     6 import java.nio.file.FileSystemAlreadyExistsException;
     7 
     8 // 测试类声明时候会初始化
     9 public class Test06 {
    10     static {
    11         System.out.println("Main类被加载");
    12     }
    13     public static void main(String[] args) {
    14         Son son = new Son();
    15     }
    16     
    17 }
    18 
    19 class Father {
    20     static  int b = 2;
    21     static {
    22         System.out.println("父类被加载");
    23     }
    24 }
    25 
    26 class Son extends Father {
    27     static {
    28         System.out.println("子类被加载");
    29         m = 300;
    30     }
    31 
    32     static int m = 100;
    33     static final int M = 1;
    34 }

    结果:

    Main类被加载
    父类被加载
    子类被加载

    1  Class.forName("reflection.Son");

    结果:

    Main类被加载
    父类被加载
    子类被加载

    不会发生类初始化情况:

    1)子类去调用父类的静态变量,不会导致子类初始化

    1  System.out.println(Son.b);

    结果:

    Main类被加载
    父类被加载
    2

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

    1    Son[] sons = new Son[5];

    结果:

    Main类被加载

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

    1  System.out.println(Son.M);

    结果:

    Main类被加载
    1

  • 相关阅读:
    9个开源支付项目,用来学习如何实现支付功能
    documentdb
    Azure Redis
    Azure Diagnostics
    Content Delivery Network (CDN)
    MVVM design pattern
    Azure Cloud Application Design and Implementation Guidance performance-optimization
    Azure Nosql
    设计原则与模式
    C# Yield
  • 原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14645337.html
Copyright © 2011-2022 走看看