zoukankan      html  css  js  c++  java
  • 类加载过程

    概述

    类里面的信息,是怎么加载的,按什么先后顺序?

    1、类的加载过程
    JVM将类的加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)
    1)、装载:查找并加载类的二进制数据;
    2)、链接:
            验证:确保被加载类的正确性
            准备:为类的静态变量分配内存,并将其初始化为默认值
            解析:把类中的符号引用转换为直接引用
    3)、初始化:为类的静态变量赋予正确的初始值
    
    2、类的初始化,类什么时候才被初始化
    1)、创建类的实例,也就是new一个对象
    2)、访问某个类或接口的静态变量,或者对该静态变量赋值
    3)、调用类的静态方法
    4)、反射(Class.forName("com.vince.Dog"))
    5)、初始化一个类的子类(会首先初始化子类的父类)
    6)、JVM启动时标明的启动类,即文件名和类名相同的那个类
    
    3、类的加载
    值的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的Java.lang.Class对象,用来封装类在方法区类的对象。
    

    实例

    /**
     * 类的加载过程
     *      1.new子类对象,先加载父类
     *      2.只调用父类静态变量(初始化过程),不加载子类
     *      3.调用常量(链接过程),子类父类都不加载
     */
    public class Demo01 {
        static {
            System.out.println("Main静态方法被加载");
        }
    
        public static void main(String[] args) {
    //        Son son = new Son();
    //        System.out.println(Son.a);
    //        System.out.println(Son.b);
            System.out.println(Son.c);
        }
    }
    class Father{
        static int a = 1;
        static {
            System.out.println("父类静态方法被加载");
        }
    }
    class Son extends Father{
        static int b = 2;
        static final int c = 3; //常量
        static {
            System.out.println("子类静态方法被加载");
        }
    }
    
  • 相关阅读:
    cf 786B. Legacy(线段树区间建图)
    cf 1416D. Graph and Queries (生成树重构+线段树维护dfs序)
    cf 1437E. Make It Increasing
    cf 1434D. Roads and Ramen (树上最长偶权链)
    cf 1413C (贪心排序+双指针)
    cf 1421E. Swedish Heroes (dp)
    CF1428 F.Fruit Sequences
    11.Redis详解(十一)------ 过期删除策略和内存淘汰策略
    10.Redis详解(十)------ 集群模式详解
    9.Redis详解(九)------ 哨兵(Sentinel)模式详解
  • 原文地址:https://www.cnblogs.com/gbhh/p/13768145.html
Copyright © 2011-2022 走看看