iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java类初始化执行流程解析
  • 460
分享到

Java类初始化执行流程解析

2024-04-02 19:04:59 460人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

 测试代码:   package com.test.ClassLaoderTest; public class test1 { public static Strin

 测试代码:  


package com.test.ClassLaoderTest;

public  class test1 {
    public static String s_variable = "静态变量";
    public String init_variable = "公开的变量";
    private String p_variable = "私有的变量";
    //静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("静态代码块初始化执行了");
    }

    //初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("初始化代码块执行沦");
    }

    //构造方法
    public test1(){
        System.out.println("我是构造方法");
    }

    public static void main(String[] args) {

    }

}

  直接运行:

    

  main方法里面不做任何调用的情况下,自动调用的是静态代码块和静态变量

  (2)调用静态变量和静态方法:

    测试代码:    


package com.test.ClassLaoderTest;


public class test1 {
    public static String s_variable = "静态变量";
    public String init_variable = "公开的变量";
    private String p_variable = "私有的变量";
    //静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("静态代码块初始化执行了");
    }

    //初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("初始化代码块执行沦");
    }

    //构造方法
    public test1(){
        System.out.println("我是构造方法");
    }

    //静态方法
    public static void test1(){
        System.out.println("这是静态方法");
    }
    public static void main(String[] args) {
        System.out.println(test1.s_variable);
        test1.test1();
    }

}

  运行:

  

  结论:当我调用静态方法/静态变量时,只会家在静态代码块,其余的代码块/构造方法不会被加载

  (3)创建对象:


package com.test.ClassLaoderTest;


public class test1 {
    public static String s_variable = "静态变量";
    public String init_variable = "公开的变量";
    private String p_variable = "私有的变量";
    //静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("静态代码块初始化执行了");
    }

    //初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("初始化代码块执行了");
    }

    //构造方法
    public test1(){
        System.out.println("我是构造方法");
    }

    //静态方法
    public static void test1(){
        System.out.println("这是静态方法");
    }
    public static void main(String[] args) {
        test1 t1 = new test1();
    }

}

  运行结果:

    

  输出内容: 

静态变量
静态代码块初始化执行了
公开的变量
私有的变量
初始化代码块执行了
我是构造方法

  结论:当创建对象/实例化的时候,调用顺序:静态代码块->初始化代码->构造方法,最后执行的才是构造方法

  (4)有继承关系下的类初始化执行流程:

   环境:

    父类:


package com.test.ClassLaoderTest;

public class father {
    public static String s_variable = "父类静态变量";
    public String init_variable = "父类公开的变量";
    private String p_variable = "父类私有的变量";
    //父类静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("父类静态代码块初始化执行了");
    }

    //父类初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("父类初始化代码块执行了");
    }

    //构造方法
    public father(){
        System.out.println("我是父类构造方法");
    }

    //父类静态方法
    public static void test1(){
        System.out.println("这是父类静态方法");
    }
}

    test1.java:

    继承其父类father:


package com.test.ClassLaoderTest;

public class test1 extends father{
    public static String s_variable = "子类静态变量";
    public String init_variable = "子类公开的变量";
    private String p_variable = "子类私有的变量";
    //子类静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("子类静态代码块初始化执行了");
    }

    //子类初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("子类初始化代码块执行了");
    }

    //子类构造方法
    public test1(){
        System.out.println("我是子类构造方法");
    }

    //子类静态方法
    public static void test1(){
        System.out.println("这是子类静态方法");
    }

    public static void main(String[] args) {
        
    }
}

  main方法不做任何操作,运行:

    

 只要extends继承了,优先调用父类静态代码块

(5)有继承关系下的调用静态方法:

    修改子类即可:


package com.test.ClassLaoderTest;

public class test1 extends father{
    public static String s_variable = "子类静态变量";
    public String init_variable = "子类公开的变量";
    private String p_variable = "子类私有的变量";
    //子类静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("子类静态代码块初始化执行了");
    }

    //子类初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("子类初始化代码块执行了");
    }

    //子类构造方法
    public test1(){
        System.out.println("我是子类构造方法");
    }

    //子类静态方法
    public static void test1(){
        System.out.println("这是子类静态方法");
    }

    public static void main(String[] args) {
        test1.test1();
        father.test1();
    }
}

  运行:

      

  结果:

父类静态变量
父类静态代码块初始化执行了
子类静态变量
子类静态代码块初始化执行了
这是子类静态方法
这是父类静态方法

  main方法中,谁优先调用静态方法,就优先加载谁

 (6)有继承关系下的创建对象:

    代码:


package com.test.ClassLaoderTest;

public class test1 extends father{
    public static String s_variable = "子类静态变量";
    public String init_variable = "子类公开的变量";
    private String p_variable = "子类私有的变量";
    //子类静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("子类静态代码块初始化执行了");
    }

    //子类初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("子类初始化代码块执行了");
    }

    //子类构造方法
    public test1(){
        System.out.println("我是子类构造方法");
    }

    //子类静态方法
    public static void test1(){
        System.out.println("这是子类静态方法");
    }

    public static void main(String[] args) {
        test1 t1 =new test1();
    }
}

  运行:

   

  结果:

父类静态变量
父类静态代码块初始化执行了
子类静态变量
子类静态代码块初始化执行了
父类公开的变量
父类私有的变量
父类初始化代码块执行了
我是父类构造方法
子类公开的变量
子类私有的变量
子类初始化代码块执行了
我是子类构造方法

  结论:通过结果会发现,不管是子类还是父类静态代码块,静态代码块在哪里都是爸爸级别,最先加载的,当创建test1对象的时候,优先加载的是父类代码块,那么他的初始化执行流程如下:父类静态代码块>子类静态代码块>父类初始化代码块>父类构造方法>子类代码块>子类构造方法

(7) 有继承关系下的创建父类对象:


package com.test.ClassLaoderTest;

public class test1 extends father{
    public static String s_variable = "子类静态变量";
    public String init_variable = "子类公开的变量";
    private String p_variable = "子类私有的变量";
    //子类静态代码块
    static {
        System.out.println(s_variable);
        System.out.println("子类静态代码块初始化执行了");
    }

    //子类初始化代码块
    {
        System.out.println(init_variable);
        System.out.println(p_variable);
        System.out.println("子类初始化代码块执行了");
    }

    //子类构造方法
    public test1(){
        System.out.println("我是子类构造方法");
    }

    //子类静态方法
    public static void test1(){
        System.out.println("这是子类静态方法");
    }

    public static void main(String[] args) {
        father father = new father();
    }
}

 运行:

  

  结果:

父类静态变量
父类静态代码块初始化执行了
子类静态变量
子类静态代码块初始化执行了
父类公开的变量
父类私有的变量
父类初始化代码块执行了
我是父类构造方法

  结论:优先执行的是两个类的静态代码块,然后是父类型的代码块和构造方法,而子类的代码块和构造方法没有被执行是因为没有实例化子类,所以肯定是没有他的,那么只有在创建对象的时候,才会调用代码块和构造方法

到此这篇关于Java类初始化执行流程的文章就介绍到这了,更多相关Java类初始化执行流程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java类初始化执行流程解析

本文链接: https://www.lsjlt.com/news/125076.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java类初始化执行流程解析
     测试代码:   package com.test.ClassLaoderTest; public class test1 { public static Strin...
    99+
    2024-04-02
  • Java子类和父类的初始化执行顺序
      要明白子类和父类的初始化执行顺序,只需要知晓以下三点,就不会再弄错了。  1.创建子类对象时,子类和父类的静态块和构造方法的执行顺序为:父类静态块->子类静态块->父类构造器->子类构造器。深入理解为什么是这个顺序,可...
    99+
    2023-06-02
  • SpringMVC初始化流程实例分析
    本文小编为大家详细介绍“SpringMVC初始化流程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringMVC初始化流程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.HttpServl...
    99+
    2023-07-02
  • java初始化分析
    关于初始化的一点体会 [@more@]class Egg2 {static int i=5; int j=5; static//父类静态变量初始化块首先被执行,在main方法之前。 { System.out.println("superCl...
    99+
    2023-06-03
  • java高并发ThreadPoolExecutor类解析线程池执行流程
    目录摘要核心逻辑概述execute(Runnable)方法addWorker(Runnable, boolean)方法addWorkerFailed(Worker)方法拒绝策略摘要 ...
    99+
    2024-04-02
  • Spring WebMVC初始化Controller流程详解
    目录SpringWebMVC初始化Controller流程获取容器初始化的所有beanName(父子容器概念)获取所有声明为Controller类的beanName开始处理这种类型的...
    99+
    2024-04-02
  • 深入了解SpringMVC初始化流程
    目录前言1.HttpServletBean2.FrameworkServlet3.DispatcherServlet4.小结前言 框架源码是我们 Coding 晋级中的必修课,SSM...
    99+
    2024-04-02
  • Java类和对象初始化过程的示例分析
    这篇文章主要介绍了Java类和对象初始化过程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  问题引入  近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内...
    99+
    2023-06-03
  • Java类的初始化过程是什么
    Java类的初始化过程包括以下几个步骤: 加载类:当程序中使用到某个类时,Java虚拟机会先通过类加载器将该类的字节码文件加载到...
    99+
    2023-10-26
    java
  • VueRouter 原理解读之初始化流程
    目录1.1 核心概念官方介绍使用与阅读源码的必要性1.2 基本使用路由配置与项目引入路由组件使用跳转 api 调用2.1 createRouter 初始化入口分析大致流程Router...
    99+
    2023-05-19
    VueRouter 初始化原理  VueRouter 初始化
  • springboot如何初始化执行sql语句
    springboot初始化执行sql语句 开发的时候需要增加一些函数和表,同时因为一些基础数据例如字典表也需要插入一些数据,当然我可以跟组员说一声然后把sql语句给他们在本地执行,但...
    99+
    2024-04-02
  • spring Bean的初始化过程解析
    AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors 使用BeanPostProce...
    99+
    2024-04-02
  • Java中实例初始化和静态初始化的过程详解
    目录一、实例初始化1.1 实例初始化过程1.2 实例初始化的顺序1.3 实例初始化的注意事项二、静态初始化2.1 静态初始化过程2.2 静态初始化的顺序2.3 静态初始化的注意事项三...
    99+
    2023-05-18
    Java实例初始化和静态初始化 Java实例初始化 Java静态初始化 Java初始化
  • SpringMVC初始化流程是什么
    本篇内容主要讲解“SpringMVC初始化流程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringMVC初始化流程是什么”吧!框架源码是我们 Cod...
    99+
    2024-04-02
  • initoutputstream初始化输出流源码分析
    目录正文音频 OutputStream初始化init_output_stream() 函数流程图正文 init_output_stream() 是一个公...
    99+
    2022-11-13
    init output stream初始化输出流 init output stream
  • Java程序初始化顺序
    Java程序的初始化一般遵循三个原则(优先级依次递减): 1,静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化很多...
    99+
    2024-04-02
  • spring初始化方法的执行顺序及其原理分析
    目录Spring中初始化方法的执行顺序首先通过一个例子来看其顺序配置我们进入这个类看我们看到了annotation-config了我们重点看下这行代码我们直接看initializeB...
    99+
    2024-04-02
  • 详解Java中类的加载与其初始化
    目录java内存分析类加载的过程类的初始化java内存分析 类加载的过程 类的加载与ClassLoader的理解 类的初始化 package Collections; publ...
    99+
    2022-12-15
    Java 类加载 初始化 Java 类加载 Java类 初始化
  • Flutter初始化流程是怎样的
    本篇内容介绍了“Flutter初始化流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flutter初始化时序Flutter初始化主...
    99+
    2023-06-04
  • Vue Router中Matcher的初始化流程
    目录MatchercreateMatcher()的初始化1、Location类型2、rowLocation类型3、Route类型4、RouteRecord类型addRoutes()的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作