Java类加载顺序

很长时间没看这方面的内容了,写篇文章让自己牢记一下,顺便分享一下。

首先,写代码以便检验结果。
测试代码:

public class Test {
    public static void main(String[] args) {
        new Test2();
    }

}

子类代码:

public class Test2 extends Test3{
    {
        System.out.println("子类代码块");
    }
    private String address = getAddress();

    static{
        System.out.println("子类静态代码块");
    }
    private static String name = get1Name();

    public Test2() {
        System.out.println("子类构造方法");
    }

    private String getAddress() {
        System.out.println("子类成员变量");
        return null;
    }

    private static String get1Name() {
        System.out.println("子类静态变量");
        return null;
    }

}

父类代码:

public class Test3 {
    private static String name = getName();

    private String address = getAddress();

    static{
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类代码块");
    }

    public Test3() {
        System.out.println("父类构造函数");
    }

    private String getAddress() {
        System.out.println("父类成员变量");
        return null;
    }

    private static String getName() {
        System.out.println("父类静态变量");
        return null;
    }

}

以上代码就可以检验出类加载的顺序了。

运行代码,控制台打印结果如下:

有父类的情况.png

无父类的情况.png

多次调换代码先后顺序,发现 变量和代码块的加载顺序和在代码中的先后顺序有关。

总结一下:
无父类情况下,加载顺序为:
静态成员变量、静态代码块 ---》 成员变量、代码块 ----》 构造方法。

有父类的情况下,加载顺序为:
父类静态成员变量、父类静态代码块 ---》 子类静态成员变量、子类静态代码块 -----》 父类成员变量、父类代码块
----》 父类构造方法 -----》 子类成员变量、子类代码块 ----》 子类构造方法。

时间: 2024-07-29 11:06:37

Java类加载顺序的相关文章

java 类加载顺序

1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法:再执行本类继承的子类的初始化块,最后是子类的构造方法 4.类实例销毁时候,首先销毁子类部分,再销毁父类部分 public class Parent { public static int t = parentStaticMethod2(); { System.out.

Java类加载顺序练习题

一.题目 public class Test { public static Test t1 = new Test();// 标记1 // 普通代码块 { System.out.println("block A");// 标记2 } // 静态代码块 static { System.out.println("block B");// 标记3 } public static void main(String[] args) { Test t2 = new Test()

Java 的类加载顺序

Java 的类加载顺序 一.加载顺序 1.父类的静态成员变量初始化 1.1.静态代码块 1.2.普通代码块 1.3.无参构造器 2.父类的静态代码块 3.子类的静态成员变量初始化 3.1.静态代码块 3.2.普通代码块 3.3.无参构造器 4.子类的静态代码块 5.父类的普通成员变量初始化 5.1.静态代码块 5.2.普通代码块 5.3.无参构造器 6.父类的普通代码块 7.父类的无参构造器 8.子类的普通成员变量 8.1.静态代码块 8.2.普通代码块 8.3.无参构造器 9.子类的普通代码块

Java虚拟机类加载顺序

Java虚拟机在加载类的时候,先初始化父类静态变量,再初始化子类静态变量,然后加载父类,最后加载子类 public class Parent { static{ System.out.println("static parent"); } public Parent(){ System.out.println("parent loaded"); } public void getaaa(){ System.out.println("parent aaa&q

扩展类加载器-------改变JAVA的父优先类加载顺序

java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做"父优先"模型. 但是在实际项目中我们可能会要求先从当前类加载加载再从父类加载器加载,如项目中的某类的版本可能和container中的不一致的时候,若还从container加载就会报jar包冲突的异常,实际上jar包冲突的问题在实际开发过程中是经常会遇到的.如我们在开发Loong时就遇到了类似问题. 解决方案是通过

深入理解 java类加载器ClassLoader

类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象,也就是万能的Class对象. Jav

JAVA学习篇--Java类加载

由来: 与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序(解释性语言).当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Javaclass加载到JVM里头运行,负责加载Javaclass的这部分就ClassLoader.中文叫做类加载器. 类加载器就好比一个代理,你需要什么,我通过类加载器将你需要的内容返回给你! 类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中. 解释: 类加载器也是Java类,因为其他是java类的

【转载】Java系列笔记(1) - Java 类加载与初始化

Java系列笔记(1) - Java 类加载与初始化 原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JVM使用类加载器(Class Loader)来加载类的字节码文件(.class),类加载器实质上是一

4.1 java 类加载器

一,类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的Java.lang.Class对象,用来封装类在方法区类的对象.看下面2图 类的加载的最终产品是位于堆区中的Class对象 Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口 加载类的方式有以下几种: 从本地系统直接加载 通过网络下载.class文件 从zip,jar等归档文件中加载.class文件 从专有数据库中