zoukankan      html  css  js  c++  java
  • 类的加载过程(类的初始化)

    类的加载过程(类的初始化)

    1.加载父类的静态变量

    2.加载父类的静态代码快

    3.加载子类的静态变量

    4.加载子类的静态代码快

    (其实,静态变量和静态代码块肯定是按照顺序初始化的,反正java语法不支持提前引用)

    类的实例化,相当于JVM对字节码文件信息的一次扫描,并且把扫描结果分类存放到方法区中。

    而方法区里存放什么呢,其实我一直对这块比较模糊,之前只知道方法区中,有常量池、有存放静态变量的静态区,在学习了反射,发现方法区中有Field区、Method区,还存放着类的继承、接口等信息。

    实例:

    package com.xm.load;
    
    public class Animal {
    
        static String str = "I`m a animal!";
    
        static {
            System.out.println(str);
            System.out.println("加载父类静态代码块");
        }
    
    
    
    }
    
    class Dog extends Animal{
    
        static String str = "I`m a dog!";
    
        static {
            System.out.println(str);
            System.out.println("加载子类静态代码块");
        }
    
    
        public static void main(String[] args) {
            new Dog();
        }
    }
    
    

    结果:

    I`m a animal!

    加载父类静态代码块

    I`m a dog!

    加载子类静态代码块

    要知道,类的加载和对象的实例化是不一样的。

    类的加载只会发生一次,而对象的实例化却是和new的次数相关的。

    而类的加载一定会发生在对象的初始化之前。

    实例:

    package com.xm.load;
    
    public class Animal {
    
        static String str = "I`m a animal!";
    
        static {
            System.out.println(str);
            System.out.println("加载父类静态代码块");
        }
    
        static void doing() {
            System.out.println("This ia a Animal!");
        }
    
        public Animal() {
            doing();
            System.out.println("Animal 对象实例化");
        }
    
    
    }
    
    class Dog extends Animal{
    
        static String str = "I`m a dog!";
    
        static {
            System.out.println(str);
            System.out.println("加载子类静态代码块");
        }
    
        static void doing() {
            System.out.println("This ia a dog!");
        }
    
        public Dog() {
            doing();
            System.out.println("Dog 对象实例化");
        }
    
    
        public static void main(String[] args) {
            new Dog();
        }
    }
    
    

    结果:

    I`m a animal!

    加载父类静态代码块

    I`m a dog!

    加载子类静态代码块

    This ia a Animal!

    Animal 对象实例化

    This ia a dog!

    Dog 对象实例化

  • 相关阅读:
    洛谷P1428 小鱼比可爱 题解 枚举
    使用二分查找来判断一个有序序列中是否存在特定元素
    基础排序(冒泡、选择、插入)学习笔记
    CF1316B String Modification 题解 字符串模拟/找规律
    洛谷P2239 螺旋矩阵 题解 模拟
    洛谷P1076 寻宝 题解 模拟
    洛谷P1308 统计单词数 题解 模拟
    TypeError: unhashable type: 'dict'
    linux shell 多个命令一起执行的几种方法
    在Linux写shell脚本,执行python指令
  • 原文地址:https://www.cnblogs.com/TimerHotel/p/java_loadClass.html
Copyright © 2011-2022 走看看