zoukankan      html  css  js  c++  java
  • JVM 1.类的加载、连接、初始化

    Java类的加载是由类加载器来完成的,过程如下:

    首先,加载是把硬盘、网络、数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用来描述该类,再在方法区存放这些二进制数据,用来保存类对应的数据结构

    Java的类加载器有哪些?

    下面的String对象是由bootstrap根类加载器加载的,而自定义类C是由系统加载器加载的:

    /**
     * 源文档中这样描述:
     *     Some implementations may use null to represent the bootstrap class loader. 
     *         This method will return null in such implementations 
     *         if this class was loaded by the bootstrap class loader.
     * @author Administrator
     *
     */
    public class ClassLoader2 {
    
        //测试
        public static void main(String[] args) throws ClassNotFoundException {
            Class c1 = Class.forName("java.lang.String");
            System.out.println("String类的加载器:"+c1.getClassLoader());//bootstrap根类加载器(C++实现的),返回null
            Class c2 = Class.forName("com.mlxs.classloader.MyClass");
            System.out.println("自定义MyClass类的加载器:"+c2.getClassLoader());//AppClassLoader 系统(应用)加载器
            /**
             * 返回数据:
             *     String类的加载器:null
             *    自定义MyClass类的加载器:sun.misc.Launcher$AppClassLoader@425224ee
             */
        }
    
    }
    
    class MyClass{
        
    }

    关于初始化,什么情况下初始化类?在主动使用的时候初始化:

    一个例子:

    public class ClassLoader1 {
    
        private static ClassLoader1 classLoader1 = new ClassLoader1();
        private ClassLoader1(){
            a ++;
            b ++;
        }
        public static int a;
        public static int b = 0;
        public static ClassLoader1 getIntsance(){
            return classLoader1;
        }
        
        //测试
        public static void main(String[] args) {
            ClassLoader1 clazz = ClassLoader1.getIntsance();
            /**
             * 类加载后,
             *     准备阶段:(1)classLoader1赋值null,(2)a和b都赋值默认值0;
             *  初始化阶段: (1)new classLoader1的时候,a++(=1),b++(=1)
             *            (2)a没默认值,值不变;b默认值为0,b赋值0
             * 所以,最后a=1,b=0
             * 
             * 如果把new ClassLoader1()放到int a b 的后面,则最后a=1,b=1
             */
            System.out.println("a:"+clazz.a);
            System.out.println("b:"+clazz.b);
        }
    
    }

    结果:

    a:1
    b:0
    

      

    要注意的是:

    子类主动使用,会导致父类的初始化;而父类主动使用,不会使子类初始化。如,new Object() 不会导致它的子类(所有的Java类)都初始化

    而子类实现接口,当子类被初始化,不会导致接口初始化。只有当接口中的静态变量被使用时才会初始化

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    2019安徽省程序设计竞赛 I.你的名字(序列自动机)
    poj3522Slim Span(暴力+Kruskal)
    Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)
    基于Python的Web应用开发实战——3 Web表单
    [nRF51822]5.触摸按键
    [nRF51822]4.GPIO控制蜂鸣器
    [nRF51822]3. GPIO输入按键检测
    [nRF51822]2. 跑马灯
    [nRF51822]1. 点亮一个LED
    [nRF51822]0.nRF51822的开发环境
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5172438.html
Copyright © 2011-2022 走看看