• 类的加载细节探索


     1 public class TestClassLoader1 {
     2     public static void main(String[] args) {
     3 
     4         Test test = new Test();
     5     }
     6 }
     7 class Test{
     8 
     9     static{
    10         m=200;
    11     }
    12 
    13     static int m=100;
    14     static{
    15         m=250;
    16         System.out.println(m);
    17         System.out.println("静态代码块执行完毕。");
    18     }
    19 
    20     public Test(){
    21         m=400;
    22         System.out.println(m);
    23         System.out.println("构造方法。");
    24     }
    25 }

    1.创建一个对象有三个阶段:加载,链接,初始化。以上示例说明:静态变量在加载的时候被加载进内存,链接时给静态变量赋初始值为0,在初始化阶段有JVM调用clinit()方法来按顺序合并静态代码块。

    2.测试什么情况下类会被加载:new 对象;调用父类的静态变量;

     1 public class Test3 {
     2     public static void main(String[] args) throws ClassNotFoundException {
     3         //1.主动加载
     4         Son son = new Son();
     5 
     6         //2.通过子类引用父类的静态变量,会让父类加载
     7         System.out.println(Son.a);
     8 
     9         //3.Class.forName()方法让子类加载
    10         Class c = Class.forName("TestMyself.Son");
    11 
    12         //4.定义数组,类不会被加载
    13         Son[] sons=new Son[3];
    14 
    15         //5.调用静态常量类也不会被加载
    16         System.out.println(Son.c);
    17     }
    18 }
    19 class Father{
    20     static int a=100;
    21     static{
    22         System.out.println("Father 静态代码块");
    23     }
    24 }
    25 
    26 class Son extends Father{
    27     static int b=200;
    28     static final int c=300;
    29     static{
    30         System.out.println("Son 静态代码块");
    31     }
    32 }

    3.获得类加载器:

    主要方法:

    classLaoder.getSystemClassLoader():获得系统类加载器;

    getParent():获得父类加载器;

     1 //获得类加载器--->Class.getClassLoader():Class对象获得类加载器
     2 public class Test4 {
     3     public static void main(String[] args) throws ClassNotFoundException {
     4         //系统类加载器:-->加载用户定义的类
     5         ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
     6         System.out.println(systemClassLoader);
     7 
     8         //扩展类加载器:-->加载扩展类
     9         ClassLoader parent = systemClassLoader.getParent();
    10         System.out.println(parent);
    11 
    12         //根加载器:--->加载核心类(用c/c++编写):
    13         ClassLoader parent1 = parent.getParent();
    14         System.out.println(parent1);
    15 
    16         ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
    17     }
    18 }
  • 相关阅读:
    VS2010 MFC对话框程序用CButtonST给按钮添加图标
    VS2010 MFC 使用GDI+给图片添加汉字
    C++ Primer(第4版)-学习笔记-第2部分:容器和算法
    C++ 面向对象编程
    C++类(Class)总结
    delegate、notification、KVO场景差别
    iOS block种类和切换
    Copy 与MutableCopy的区别
    ios 避免循环引用
    WKInterfaceImage 无法更新图片的问题
  • 原文地址:https://www.cnblogs.com/xbfchder/p/11013323.html
Copyright © 2020-2023  润新知