【静态初始化块、静态变量、静态方法的赋值赋值时机】

news2024/11/17 7:13:15

在 Java 中,静态初始化块静态变量静态方法的赋值或执行时机与类加载密切相关。下面详细说明它们的赋值时机和执行顺序。


1. 静态变量的赋值时机

静态变量是属于类本身的变量,在类加载过程中完成初始化。赋值过程如下:

赋值阶段
  1. 默认初始化(类加载的准备阶段):

    • JVM 为静态变量分配内存,并赋予默认值(如数字为 0,布尔为 false,引用类型为 null)。
    • 例如:
      static int a;  // 默认值为 0
      static boolean b;  // 默认值为 false
      
  2. 显式赋值(类加载的初始化阶段):

    • 如果静态变量有初始值,类加载时会将显式赋值覆盖默认值。
    • 例如:
      static int a = 10;  // 在类加载的初始化阶段,a 被赋值为 10
      
  3. 静态代码块中的赋值

    • 静态变量还可以在静态初始化块中被重新赋值。
    • 静态代码块会按照代码中的顺序依次执行。

2. 静态初始化块的执行时机

静态初始化块在类加载的初始化阶段执行,用于对类进行额外的初始化操作。

执行特点
  1. 顺序执行

    • 如果有多个静态初始化块,按照它们在代码中的顺序依次执行。
    • 静态初始化块会在所有静态变量完成显式赋值之后执行。
  2. 触发时机

    • 静态初始化块会在类加载时执行,并且只执行一次。
    • 类加载的触发条件包括:
      • 首次访问类的静态变量。
      • 首次调用类的静态方法。
      • 类实例化(通过构造方法)。
      • 显式调用 Class.forName() 方法。

3. 静态方法的执行时机

静态方法是在类级别定义的,可以通过类名直接调用,而不需要实例化对象。

执行特点
  1. 加载类时不立即执行

    • 静态方法本身不会触发类的加载或初始化。
    • 静态方法的执行取决于是否被显式调用。
    • 调用时,类如果未加载,则先触发类加载。
  2. 调用时触发

    • 如果类未被加载,调用静态方法会导致类加载和静态初始化块的执行。

赋值或执行顺序

假设以下代码:

class Example {
    static int a = 10;  // 静态变量显式赋值
    static int b;       // 静态变量声明
    static {
        b = 20;         // 静态代码块中为 b 赋值
        System.out.println("Static block executed");
    }

    static void print() {
        System.out.println("a = " + a + ", b = " + b);
    }
}

public class Main {
    public static void main(String[] args) {
        Example.print();  // 触发静态方法
    }
}
执行过程
  1. 类加载触发:

    • 由于调用了 Example.print(),类 Example 被加载。
  2. 静态变量赋值:

    • a 被赋值为 10(显式赋值覆盖默认值)。
    • b 默认值为 0,但静态代码块中将其赋值为 20。
  3. 静态初始化块执行:

    • 静态代码块被执行,输出 "Static block executed"
  4. 静态方法执行:

    • 调用 print() 方法,输出静态变量的值。
输出结果
Static block executed
a = 10, b = 20

总结:赋值时机和顺序

特性赋值或执行时机触发条件
静态变量默认初始化:类加载的准备阶段。
显式赋值:类加载的初始化阶段。
类首次加载时自动执行。
静态代码块在类加载的初始化阶段,静态变量赋值完成后按顺序执行。类首次加载时自动执行,只执行一次。
静态方法只有在显式调用时才执行,调用时触发类加载(如果未加载)。方法被调用时执行。如果类未加载,会触发类加载。

静态变量和静态初始化块共同决定类的初始状态,而静态方法则提供了类级别的行为,执行时可能触发类加载和静态初始化。

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

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

相关文章

TCP(下):三次握手四次挥手 动态控制

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP(上):成熟可靠的传输层协议-CSDN博客 🥝在上篇博客中,我们针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行了探讨,提供了初步的理解和概览。本…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉,无论是赛题难度还是认可度,该比赛都是数模届的独一档,含金量极高,可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易,为了帮助大家取得好成绩…

菲涅耳全息图

菲涅耳全息图:记录介质在物光波场的菲涅耳衍射区(物体到记录介质表面的距离在菲涅耳衍射区内)。 一、点源全息图的记录和再现 1.1 记录 设物光波和参考光波是从点源O(xo, yo, zo)和点源 R(xr, yr, zr)发出的球面波, 波长为λ1, 全息底片位于z0 的平面上, 与两个点源…

Pygame坦克大战游戏开发实验报告

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

微搭低代码入门05循环

目录 1 for 循环2 while 循环3 do...while 循环4 break 语句5 循环展示组件总结 在编程中,循环是一种非常强大的控制结构,它允许我们重复执行一段代码直到满足某个条件为止。在微搭中,我们一般用循环来处理我们数据库返回的结果。 在微搭中&a…

C++:基于红黑树封装map和set

目录 红黑树的修改 红黑树节点 红黑树结构 红黑树的迭代器 红黑树Insert函数 红黑树的默认成员函数 修改后完整的红黑树 set、map的模拟实现 set map 测试封装的set和map 红黑树的修改 想要用红黑树封装map和set,需要对之前实现的key-value红黑树进行修…

【深度学习基础 | 预备知识】数据预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

前端面试笔试(四)

目录 一、数据结构算法等综合篇 1.线性探查法解决哈希冲突 2.请求分页系统中文件区和对换区 3.RADIUS认证协议,运行在哪个网络协议上 二、代码输出篇 1.res[1,2,100].map(parseInt) 如果我们想要输出为[1,2,100],可以: 还可以换map里…

从零开始学习 sg200x 多核开发之 milkv-duo256 编译运行 sophpi

sophpi 是 算能官方针对 sg200x 系列的 SDK 仓库 https://github.com/sophgo/sophpi ,支持 cv180x、cv81x、sg200x 系列的芯片。 SG2002 简介 SG2002 是面向边缘智能监控 IP 摄像机、智能猫眼门锁、可视门铃、居家智能等多项产品领域而推出的高性能、低功耗芯片&a…

【客户服务】互联网时代客户投诉处理金点子

互联网时代客户投诉新特点 客户投诉渠道广投诉的内容涉及到企业的各个方面客户维权意识越来越强负面效应很难管 卓越客户体验成为企业核心竞争力 移动互联网与社会化媒体背景下,客户的全方位感知、情感、卓越体验、高效需求成为驱动技术、应用、终端以及服务持续…

SQL 审核在 CloudQuery 的四大场景应用

数据库作为数据的核心载体,其安全性和稳定性对业务的影响至关重要。而在我们日常业务中,SQL 编写不当是引起数据库故障的一个重要原因,轻则影响数据库性能,重则可能直接导致「雪崩」。因此,SQL 审核作为 SQL 代码投入生…

【前端知识】Javascript前端框架Vue入门

前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期完整示例1. 创建 Vue 项目(如果还没有)2. 定义和使用组件3. 在主应用中使用组件4. 运行应用完整项目结构 参考文献 概述 V…

Jmeter基础篇(24)Jmeter目录下有哪些文件夹是可以删除,且不影响使用的呢?

一、前言 Jmeter使我们日常做性能测试最常用的工具之一啦!但是我们在和其他同学协同工作的时候,偶尔也会遇到一些问题,例如我想要给别人发送一个Jmeter工具包,但这个文件包往往会很大,比较浪费流量和空间,…

Python_爬虫3_Requests库网络爬虫实战(5个实例)

目录 实例1:京东商品页面的爬取 实例2:亚马逊商品页面的爬取 实例3:百度360搜索关键词提交 实例4:网络图片的爬取和存储 实例5:IP地址归地的自动查询 实例1:京东商品页面的爬取 import requests url …

StructuredStreaming (一)

一、sparkStreaming的不足 1.基于微批,延迟高不能做到真正的实时 2.DStream基于RDD,不直接支持SQL 3.流批处理的API应用层不统一,(流用的DStream-底层是RDD,批用的DF/DS/RDD) 4.不支持EventTime事件时间(一般流处理都会有两个时间:事件发生的事件&am…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP?HTTP和HTTPS有什么区别?分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别?HTTP请求方式有哪些?请解释GET和POST的区别?HT…

转轮数组(C语言实现)

题目介绍 方法一我们可以先把数字1 2 3 4逆转一下&#xff0c;第二步我们可以逆转一下5 6 7&#xff0c; 最后整体逆置一下就会变成上面的数字。 void reverse(int* nums, int begin, int end) {while (begin < end){int tmp nums[begin];nums[begin] nums[end];nums[en…

Ubuntu 的 ROS 操作系统 turtlebot3 gazebo仿真

引言 TurtleBot3 Gazebo仿真环境是一个非常强大的工具&#xff0c;能够帮助开发者在虚拟环境中测试和验证机器人算法。 Gazebo是一个开源的3D机器人仿真平台&#xff0c;它能支持物理引擎&#xff0c;允许机器人在虚拟环境中模拟和测试。结合ROS&#xff0c;它能提供一个完整的…

uniapp vuex的使用

实现组件全局&#xff08;数据&#xff09;管理的一种机制&#xff0c;可以方便的实现组件之间共享数据&#xff0c;不同于上述三种传递值的方式。 可以把vuex当成一个store仓库&#xff0c;可以集中管理共享的数据&#xff0c;并且存储在vuex中的数据都是响应式的&#xff0c…

uniapp适配暗黑模式配置plus.nativeUI.setUIStyle适配DarkMode配置

uniapp适配暗黑模式配置 目录 uniapp适配暗黑模式配置setUIStyleDarkMode 适配app-plus manifest.json配置theme.json配置pages.json配置页面切换代码实现同步手机暗黑配置额外适配 参考官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/darkmode.html 主要用到api…