Java里局部变量和成员变量的隐式初始化

注:本文是对另一篇文档( https://blog.csdn.net/duke_ding2/article/details/142365872 )的补充。

文章目录

  • 环境
  • 初始化
    • 局部变量(栈)
    • 成员变量(堆)
    • 其它
      • 数组
  • 分析
    • 安全性
    • 性能
    • 成员变量 VS. 局部变量
  • 总结

环境

  • Windows 11 专业版
  • Java 21

初始化

局部变量(栈)

局部变量不会自动初始化,所以必须要先赋值,再使用。

    public static void main(String[] args) {int n1 = 0;int n2;System.out.println("n1: " + n1);System.out.println("n2: " + n2); // 编译错误:变量没有初始化boolean b1 = false;boolean b2;System.out.println("b1: " + b1);System.out.println("b2: " + b2); // 编译错误:变量没有初始化Object o1 = null;Object o2;System.out.println("o1: " + o1);System.out.println("o2: " + o2); // 编译错误:变量没有初始化}

注意:在Java 21之前(比如Java 17),对于引用类型的局部变量(比如上例中的 o2 ),是会自动初始化为null的。Java 21引入了更加严格的限制,所有局部变量都必须先赋值,再使用

成员变量(堆)

成员变量会自动初始化为 0falsenull 等。

public class Test1212_31 {private int n1;private boolean b1;private Object o1;public static void main(String[] args) {var obj = new Test1212_31();System.out.println(obj.n1);System.out.println(obj.b1);System.out.println(obj.o1);}
}

输出结果如下:

0
false
null

其它

数组

在Java里,数组是对象,所以,创建数组后,数组里的元素可以隐式的初始化( 0falsenull 等)。

数组对象是在堆上创建的,可以把数组里的元素想象成类似数组对象的成员变量。

(注意:Java的数组是定长的,一旦创建了数组对象,其长度就不能变化了。当然,对于多维数组,只有最高维是不能变化的。)

    public static void main(String[] args) {int[] arr1 = new int[3];for (int n : arr1)System.out.println(n);boolean[] arr2 = new boolean[3];for(boolean b : arr2)System.out.println(b);Object[] arr3 = new Object[3];for (Object o : arr3)System.out.println(o);}

输出结果如下:

0
0
0
false
false
false
null
null
null

分析

局部变量不会自动初始化,成员变量会自动初始化。为什么要如此设计呢?

安全性

“先赋值,再使用”是一个通用的法则,通常我们也是这么做的,很少出现不赋值就使用的情况。

如果不清楚语言特性,那么“先赋值,再使用”显然是一个good practice。如果不赋值就使用,那么假如没有隐式初始化,则可能会出现无法预料的结果(因为变量的值无法预料)。通过强制程序员初始化变量,Java编译器可以在编译阶段就发现这些问题,提高代码的质量和安全性。

性能

我们知道,局部变量是在栈(stack)里的,其特点是生命周期较短,而调用较频繁,比如:

    public void foo(int arg1) {int n1;n1 = arg1 * 2;......}

foo() 方法可能会被频繁调用,如果 n1 隐式初始化为 0 ,显然在频繁调用 foo() 方法时,其开销会更大(而且一般也没有必要)。

再看另外一个例子:

    public void bar() {for (int i = 0; i < 100; i++) {int temp;temp = i * 2;......}}

temp 变量是在循环内部定义的,和上一个例子类似,在循环次数很多时,隐式初始化的开销会更大(而且一般也没有必要)。

成员变量 VS. 局部变量

我们知道,对象是在堆(heap)上创建,所以,对象的成员变量也是在堆上的。对象的特点(相对于局部变量)是:

  • 数量较少
  • 生命周期较长

可能是为了帮助程序员确保对象的一致性和完整性,编译器对成员变量进行了隐式初始化。由于数量相对比较少,隐式初始化的开销也不算特别大。

如果没有隐式初始化,程序员很可能需要在对象的构造方法里对成员变量做初始化。隐式初始化使得代码更加简洁,程序员可以集中精力在更重要的事情上面。

总结

  • 局部变量(在栈上创建)没有隐式初始化,必须先赋值,再使用
  • 成员变量(在堆上创建)会隐式初始化( 0falsenull 等),可以直接使用

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

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

相关文章

孚盟云 MailAjax.ashx SQL注入漏洞复现

0x01 产品简介 上海孚盟软件有限公司是一家外贸SaaS服务提供商,也是专业的外贸行业解决方案专业提供商。 全新的孚盟云产品,让用户可以用云模式实现信息化管理,让用户的异地办公更加流畅,大大降低中小企业在信息化上成本,用最小的投入享受大型企业级别的信息化服务,主要…

“切片赋值”创建列表批量操作“新”方法(Python)

[start:end]切片赋值&#xff0c;扩展了list批量增减元素的操作能力。 (笔记模板由python脚本于2024年12月06日 15:07:56创建&#xff0c;本篇笔记适合研python基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;…

LabVIEW实现GPS通信

目录 1、GPS通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…

Java简介:打开通往变成世界的大门

Java是什么&#xff1f;为什么它是全球开发者广泛使用的语言&#xff1f;本篇文章介绍Java的特点、应用场景以及“写一次&#xff0c;随处运行”的核心特性&#xff0c;让零基础的你建立对Java语言的初步认知。 注&#xff1a;此文章可以仅作了解&#xff0c;不影响之后的学习。…

Unraid实现相册同步与展示的方案探讨

背景&#xff1a;Unraid作为一个NAS系统&#xff0c;能够实现基本的NAS文件管理功能&#xff0c;但是不提供额外的功能如影音、同步、办公、和内网穿透等&#xff0c;这些在其他的NAS产品如群晖、绿联、威联通等都是提供支持的。然而unraid也有其他方案&#xff0c;即通过特别方…

常见的网络攻击手段

IP 欺骗 IP 是什么? 在网络中&#xff0c;所有的设备都会分配一个地址。这个地址就仿佛小蓝的家地址「多少号多少室」&#xff0c;这个号就是分配给整个子网的&#xff0c;「室」对应的号码即分配给子网中计算机的&#xff0c;这就是网络中的地址。「号」对应的号码为网络号…

积分形式的辐射传输方程

The Equation of Transfer in Integral Form Let L L L be the streaming-collision operator, and S S S is scattering operator, we have L I Ω ⋅ ∇ I ( r , Ω ) σ ( r , Ω ) I ( r , Ω ) LI\Omega\cdot\nabla I(r,\Omega)\sigma(r,\Omega)I(r,\Omega) LIΩ⋅∇…

JS中reduce方法

JavaScript 中的 reduce 方法是一个非常强大的数组方法&#xff0c;它允许你对数组中的所有元素执行一个“reducer”函数&#xff0c;从而将数组“减少”到一个单一的值。以下是 reduce 方法的详细介绍&#xff1a; 语法 array.reduce(function(accumulator, currentValue, c…

印闪网络:阿里云数据库MongoDB版助力金融科技出海企业降本增效

客户背景 上海印闪网络科技有限公司&#xff0c;于2017年1月成立&#xff0c;投资方包括红杉资本等多家国际知名风投公司。公司业务聚焦东南亚普惠金融&#xff0c;常年稳居行业头部。创始团队来自腾讯&#xff0c;中国团队主要由运营、风控及产研人员组成&#xff0c;核心成员…

【后端面试总结】HTTPS工作原理详解

引言 在现代网络通信中&#xff0c;数据的安全性至关重要。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;作为互联网上传输数据的协议&#xff0c;虽然应用广泛&#xff0c;但其数据以明文形式传输&#xff0c;存在被窃取和篡改的风险。为此&#xff0c;HTTPS&…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&a…

Java 基础知识——part 1

1.目前Java平台有三种版本&#xff1a; Java SE&#xff1a;用于开发桌面应用程序 Java EE&#xff1a;用于编写企业级应用程序 Java ME&#xff1a;用于开发设备应用程序 2.Applet可嵌入Web文档的一种小型程序&#xff0c;因网络传输速度关系都很短小 3.Appilication&…

【云计算】虚拟化技术

目录 1. 虚拟化技术在云计算中的那些地方发挥了关键作用&#xff1f; 2. 比较VMare&#xff0c;Xen等虚拟化产品的关键技术&#xff0c;以及对云计算技术提供的支持&#xff1f; 3. 服务器虚拟化&#xff0c;存储虚拟化和网络虚拟化都有哪些实现方式&#xff1f; 4. 讨论桌面…

力扣题目 - 2931.购买物品的最大开销

题目 还需要你前往力扣官网查看详细的题目要求 地址 思路 这边需要你去力扣官网详细查看题目看了题目提供的示例 已经有了解法, 先把values转成1维数组,排序之后进行累加即可 代码 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …

嵌入式驱动开发详解6(RTC)

文章目录 前言RTC简介RTC驱动分析RTC驱动框架RTC驱动实现 RTC应用后续 前言 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能&#x…

单片机:实现跑马灯(附带源码)

单片机实现跑马灯 跑马灯&#xff08;也称作流水灯&#xff09;是一种常见的电子效果&#xff0c;通过依次点亮和熄灭多个LED灯&#xff0c;模拟出一个灯光流动的效果。跑马灯常见于装饰性电子产品中&#xff0c;也是一种展示单片机控制多路输出的基础应用。 在本项目中&…

力扣题目 - 935. 骑士拨号器

题目 还需要你前往力扣官网查看详细的题目要求 地址 1.象棋骑士有一个独特的移动方式&#xff0c;它可以垂直移动两个方格&#xff0c;水平移动一个方格&#xff0c;或者水平移动两个方格&#xff0c;垂直移动一个方格(两者都形成一个 L 的形状)。2.象棋骑士可能的移动方式如下…

传输层7——TCP拥塞控制(重点!!!)

目录 一、认识拥塞控制 1、什么叫做拥塞&#xff1f; 2、拥塞的特点 3、流量控制 VS 拥塞控制 二、TCP如何防止拥塞&#xff1f; 1、慢开始 2、拥塞避免 3、3重复确认 和 快重传算法 4、快恢复算法 5、总结 三、主动队列管理AQM 1、技术背景 2、AQM思 想和实现策略…

PostgreSQL/PostGIS中提升空间查询(分析)性能(效率)的一些方法

目录 1. 使用适当的索引 1.1 索引类型 1.2 分析查询计划 1.3 覆盖索引 1.4 复合索引 1.5 维护索引 1.6 删除不必要的索引 1.7 使用适当的数据类型 2. 建立分区表 2.1 分区表的基本概念 2.2 创建分区表的步骤 2.3 空间数据的分区 2.4 分区表优点 3. 简化几何形状 …

轮播(css+js)

目录 1.实现效果 2.基础代码演示 2.1js代码 2.1css样式 2.3实现效果 3.实现点击切换 3.1给button添加点击事件 3.2效果图如下 3.3发现问题 3.3.1不循环 3.3.2循环 1.实现效果 2.基础代码演示 2.1js代码 <div class"out-box"><div class"tes…