图文详解Java中class的初始化顺序

 更新时间:2016年08月16日 17:36:43   作者:晓来谁听风雨声  
网上有很多关于Java中class的初始化顺序文章,但是本文通过图文更加详细的介绍了Java中class的初始化顺序,并对class的装载顺序进行了讲解,下面一起来看看。

class的装载

在讲class的初始化之前,我们来讲解下class的装载顺序。

以下摘自《Thinking in Java 4》

由于Java 中的一切东西都是对象,所以许多活动

变得更加简单,这个问题便是其中的一例。正如下一章会讲到的那样,每个对象的代码都存在于独立的文件中。除非真的需要代码,否则那个文件是不会载入的。通常,我们可认为除非那个类的一个对象构造完毕,否则代码不会真的载入。由于static 方法存在一些细微的歧义,所以也能认为“类代码在首次使用的时候载入”。

首次使用的地方也是static 初始化发生的地方。装载的时候,所有static 对象和static 代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序)。当然,static 数据只会初始化一次。

简要的说就是,在类有继承关系时,类加载器上溯造型,进行相关类的加载工作。

比如:

Class B extends Class A
当我们new B()时,类加载器自动加载A的代码

class的初始化顺序

通常是以下这样的初始化顺序:

(static对象和static代码块,依据他们的顺序进行初始化)>成员变量>构造函数

测试代码

public class ClassInit {

  /**
   * @Title:       main
   * @Description:   类初始化顺序测试
   * @param:       @param args  
   * @return:     void  
   * @throws
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub    
    new B();
  }

}

class A {
  static{
    System.out.println("A的static代码块...");
  }
  public String s1 = prtString("A的成员变量...");
  public static String s2 = prtString("A的static变量...");
  public A(){
    System.out.println("A的构造函数...");
  }

  public static String prtString(String str) {
    System.out.println(str);
    return null;
  }
}

class B extends A{
  public String ss1 = prtString("B的成员变量...");
  public static String ss2 = prtString("B的static变量...");
  public B(){
    System.out.println("B的构造函数...");
  }
  private static A a = new A();
  static{
    System.out.println("B的static代码块...");
  }
  {
    System.out.println("代码块...");
  }  
}

测试结果

A的static代码块...
A的static变量...
B的static变量...
A的成员变量...
A的构造函数...
B的static代码块...
A的成员变量...
A的构造函数...
B的成员变量...
代码块...
B的构造函数...

总结

以上就是Java中class的初始化顺序的全部内容,希望对大家使用Java能有所帮助。

相关文章

  • Java 面试题和答案 - (下)

    Java 面试题和答案 - (下)

    本文主要介绍Java 面试题,这里整理了Java面试题关于JDBC,线程异常处理,Servlet,JSP的知识的整理,帮助大家理解知识点,便于面试,有兴趣的小伙伴可以参考下
    2016-09-09
  • SpringBoot+Vue实现数据添加功能

    SpringBoot+Vue实现数据添加功能

    这篇文章主要介绍了SpringBoot+Vue实现数据添加功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java中使用增强for循环的实例方法

    Java中使用增强for循环的实例方法

    在本篇文章里小编给大家整理是的关于Java中如何使用增强for循环的实例内容以及相关代码,需要的朋友们可以学习下。
    2019-08-08
  • 基于MapperXML扫描的问题

    基于MapperXML扫描的问题

    这篇文章主要介绍了MapperXML扫描的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java面向对象的封装特征深度解析

    Java面向对象的封装特征深度解析

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问
    2021-10-10
  • 简要分析Java的Hibernate框架中的自定义类型

    简要分析Java的Hibernate框架中的自定义类型

    这篇文章主要介绍了Java的Hibernate框架中的自定义类型,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2016-01-01
  • Java Kafka实现优先级队列的示例详解

    Java Kafka实现优先级队列的示例详解

    在分布式系统中,消息队列是一种常见的异步通信机制,而优先级队列则是消息队列的一种特殊形式,下面我们来看看如何利用Kafka实现优先级队列吧
    2025-03-03
  • SpringBoot应用自定义logback日志详解

    SpringBoot应用自定义logback日志详解

    默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。本篇文章主要讲解下如何自定义logabck.xml以及对logback文件中配置做一个详解,需要的可以参考一下
    2022-10-10
  • java正则替换img标签中src值的方法

    java正则替换img标签中src值的方法

    今天小编就为大家分享一篇java正则替换img标签中src值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • SpringBoot3实战教程之实现接口签名验证功能

    SpringBoot3实战教程之实现接口签名验证功能

    接口签名是一种重要的安全机制,用于确保 API 请求的真实性、数据的完整性以及防止重放攻击,这篇文章主要介绍了SpringBoot3实战教程之实现接口签名验证功能,需要的朋友可以参考下
    2025-04-04

最新评论