Java代码执行顺序

news2024/11/23 17:08:09

Java代码的执行顺序

后面大量的涉及到了static,我曾经写过一篇static的博客,可以看一眼

我上次写了static的加载顺序,没看过的可以进去看一眼

JavaSE:static关键字详解

---------------------分割线-----------------------------------------

我们先来看几个demo,难度从简单到难

demo1

public class Demo1 {

    public Demo1(String aa) {
        System.out.println("======" + aa);
    }

    static {
        System.out.println("11");
    }

    public static Demo1 demo1 = new Demo1("+++++");
}
class A {// 内部类
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1("------");
    }
}

代码的执行顺序是?

运行结果

在这里插入图片描述
静态代码块和静态变量同属于静态部分,都是最优先加载

demo2

public class Demo2 extends Base {

    static {
        System.out.println("test static");
    }

    public Demo2() {
        System.out.println("test construct");
    }

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

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

}

class Base {
    public Base() {
        System.out.println("base construct");
    }

    static {
        System.out.println("base static");
    }


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

代码的执行顺序是?

运行结果

在这里插入图片描述
我们发现

  1. 静态代码块最优先执行,但是父类的静态代码块比子类的静态代码块更优先
  2. 然后是普通代码块,依然是父类先执行
  3. 最后是构造器,同上

原因:

  1. 双亲委派机制,让类加载器classLoader加载类时,优先加载父类
  2. 普通代码块只有创建对象后才能进入堆内存,才能执行
  3. 子类执行构造方法时,会先去执行父类的构造方法

双亲委派机制很复杂,这里只是简单的概述,大致意思是,保证类只会加载一次 + 父类优先加载

总结:
①Demo1类加载时,先去扫描父类是否存在,Base存在,然后优先加载父类,所以父类的静态代码块先执行
②两个类加载到方法区之后,开始执行main方法。
③main方法通过Demo1类的无参构造创建了一个Demo1类的对象,执行Demo1的构造方法之前,会先去执行父类的无参构造,创建了一个父类的匿名对象,放入堆中
④只要在堆中开辟了空间,代码块就会执行,随后创造对象。所以父类的代码块先执行,然后执行父类的构造方法;子类的代码块靠后执行,然后是构造方法

⑤构造方法执行完毕之后,最后才会轮到main方法中,对象调用的其他非静态方法

demo3(非常难)

public class Demo3 {

    private static int k = 1;

    private static Demo3 t1 = new Demo3("t1");
    private static Demo3 t2 = new Demo3("t2");
    private static int i = print("i");
    private static int n = 99;


    public Demo3(String str) {
        System.out.println((k++) + ":" + str + "        i=" + i + "       n=" + n);
        ++i;
        ++n;
    }

    static {
        print("静态块");
        n = 100;
    }

    public static int print(String str) {
        System.out.println((k++) + ":" + str + "        i=" + i + "       n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {

    }

}

代码的执行顺序是?

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

✌粤嵌—2024/4/3—合并K个升序链表

代码实现: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言: 最近在完成公司的项目时,为了兼容其他的版本,需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包,安装成功之后,分享如下: 安装命令: ant-design-vue: 不…

[移动通讯]【无线感知-P1】[从菲涅尔区模型到CSI模型-2]

前言: 前面我们学习了: 1 只 基于机器学习做无线感知问题:泛化性能差,可解释性差 无法解释为什么能做好,什么时候能做好,什么时候做不好. 可行性 到 可用性,泛化性问题,具体深入的研究。 2 无线感知的理论…

解决npm run dev跑项目,发现node版本不匹配,怎么跑起来?【已解决】

首先问题点就是我们npm run dev 运行项目的时候发现出错,跑不起来,类型下面这种 这里的出错的原因在于我们的node版本跟项目的版本不匹配 解决办法 我这里的问题是我的版本是node14的,然后项目需要node20的,执行下面的就可以正…

【面试八股总结】排序算法(二)

参考资料 :阿秀 一、堆排序 堆排序基本思想是先把数组构造成一个大顶堆(父亲节点大于其子节点),然后把堆顶(数组最大值,数组第一个元素)和数组最后一个元素交换,这样就把最大值放到了数组最后边。把数组长度n-1,再进行构造堆把剩…

HackMyVM-Connection

目录 信息收集 arp nmap WEB web信息收集 dirsearch smbclient put shell 提权 系统信息收集 suid gdb提权 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.115 S…

【PostgreSQL里insert on conflict do操作时的冲突报错分析】

最近在巡检PostgreSQL的数据库的时候,发现部分数据库里存在大量的如下报错 ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained val…

LRTimelapse for Mac:专业延时摄影视频制作利器

LRTimelapse for Mac是一款专为Mac用户设计的延时摄影视频制作软件,它以其出色的性能和丰富的功能,成为摄影爱好者和专业摄影师的得力助手。 LRTimelapse for Mac v6.5.4中文激活版下载 这款软件提供了直观易用的界面,用户可以轻松上手&#…

第十五届蓝桥杯题解-好数

题目大意&#xff1a;一个数的低位为奇数&#xff0c;次低位为偶数&#xff0c;以此类推的数成为好数&#xff0c;例如&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9 给定一个n&#xff0c;求1-n所有好数的个数&#xff0c;n<1e7 思路&#xff1a;一…

5_vscode+valgrind+gdb调试程序

需求 项目程序, 读取串口数据, 出现程序崩溃问题valgrind 可以调试定位内存问题: 内存泄漏,非法地址访问,越界访问等内存问题vscode gdb 可视化调试效果, 比命令行简单快捷很多期望使用vscode valgrind gdb 调试程序内存异常, 崩溃退出的问题 环境准备 sudo apt install v…

windows Webrtc +VS2019 (M124)下载编译以及调通测试demo

下载depot tools 设置梯子 git config --global http.proxy 127.0.0.1:10000 git config --global https.proxy 127.0.0.1:10000 下载 $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 设置depot_tools目录为环境变量 下载webrtc # 设置系统代…

SCADA系统通过巨控GRM模块实现OPC协议远程监控PLC

SCADA系统和PLC不在同一个地方&#xff0c;需要远程监控和控制PLC&#xff0c;可以通过巨控GRM模块来实现&#xff0c;通过OPC协议转巨控服务器远程读写PLC寄存器&#xff0c;从而完成远程监控PLC。 要实现SCAKDA系统远程监控PLC&#xff0c;关键是要实现SKADA能通过互联网访问…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

艾体宝方案 | ITT-Profitap IOTA——铁路运输的远程网络捕获和故障排除方案

在移动互联时代&#xff0c;铁路运输的数字化转型已成不可逆转的趋势。然而&#xff0c;随之而来的是对网络连接质量和故障排查的更高要求。本文将探讨如何利用艾体宝Profitap IOTA技术&#xff0c;在火车上实现远程网络捕获和故障排查&#xff0c;助力铁路运输行业迈向智能化未…

OpenStack:开源云计算的崛起与发展

目录 一&#xff0c;引言 二&#xff0c;OpenStack的起源 三&#xff0c;OpenStack的版本演进 四&#xff0c;OpenStack跟虚拟化的区别 五&#xff0c;OpenStack组件介绍 1&#xff09;Horizon介绍 2&#xff09;KeyStone介绍 Keystone 功能概览 Keystone 架构详解 3&a…

51单片机之DS1302实时时钟

1.DS1302时钟芯片介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能RTC(Real Time Clock)&#xff1a;实时时钟&#xff0c;是一种集成电路&#xff0c;通常称…

基于stm32_h5的freertos编程示例

目录 基于stm32_h5的freertos编程示例实验目的添加FreeRTOS配置FreeRTOS测试工程本文中使用的测试工程 基于stm32_h5的freertos编程示例 本文目标&#xff1a;基于stm32_h5的freertos编程示例 按照本文的描述&#xff0c;应该可以在对应的硬件上通实验并举一反三。 先决条件…

类的加载,反射和注解详解

文章目录 类的加载概述类加载器作用分类获取类加载器的方式 双亲委派机制3种加载器的关系工作机制 类加载器的应用 反射概述关键获取类对象获取构造器对象获取方法对象获取成员变量对象作用 注解概述作用自定义注解格式属性类型 元注解常见的元注解 注解解析概述方法技巧 类的加…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

还有同学开题报告没写吗?

引言 作为一名在软件技术领域深耕多年的专业人士&#xff0c;我不仅在软件开发和项目部署方面积累了丰富的实践经验&#xff0c;更以卓越的技术实力获得了&#x1f3c5;30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定&#xff0c;也是对我的创新精神和专业承诺…