Java面试八股之Java中为什么没有全局变量

news2024/11/18 11:26:48
  1. Java中为什么没有全局变量

Java中没有传统意义上的全局变量,这是因为Java语言设计遵循面向对象的原则,强调封装性和模块化,以及避免全局状态带来的副作用。

封装性: 全局变量违反了面向对象编程中的封装原则,即隐藏对象内部细节,仅通过公开的接口与外界交互。全局变量对所有代码可见,容易导致数据被任意模块直接访问和修改,破坏了数据的封装性,使得程序难以理解和维护。

模块化与耦合度: 全局变量使得各模块间隐性地依赖于全局状态,增加了模块间的耦合度。高耦合度使得代码难以复用、测试和升级,因为任何对全局变量的修改都可能影响到程序的其他部分。面向对象编程提倡通过对象间的显式交互(如方法调用和消息传递)来降低耦合度,提高模块化程度。

命名空间污染与冲突: 全局变量共享单一的命名空间,随着项目的规模增长,容易导致名称冲突。而在面向对象编程中,每个类都有其自身的命名空间(即成员变量和方法),通过类的组织可以有效地管理命名空间,减少冲突。

并发与线程安全: 全局变量在多线程环境下尤其危险,因为多个线程可以同时访问和修改同一全局变量,如果没有适当的同步控制,很容易引发竞态条件、数据不一致等并发问题。面向对象编程鼓励通过封装状态在对象内部,并使用线程安全的构造(如同步方法、锁机制、原子类等)来管理并发状态。

替代方案: Java提供了替代全局变量的机制,如:

静态成员变量(类变量):属于类而非特定对象,可通过类名直接访问,作用域限于该类及其所有实例,但仍优于全局变量,因为它们位于特定的类命名空间内,减少了命名冲突的风险。同时,可以控制静态成员变量的访问权限(如public、private等),实现一定程度的封装。

单例模式:用于创建一个全局唯一的对象实例,可以通过该单例对象的方法来访问和管理其内部状态。这种方式比全局变量更易于控制访问权限、实现线程安全,并且可以添加行为(方法)。

依赖注入(DI):在现代Java框架(如Spring)中,通过依赖注入机制,组件之间的共享状态可以以服务或依赖的形式注入到需要它们的组件中,而不是通过全局变量来访问。这种方式进一步增强了代码的可测试性、可配置性和解耦程度。

如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

【ARM 裸机】模仿 STM32 驱动开发

1、修改驱动 对于 STM32 来说,使用了一个结构体将一个外设的所有寄存器都放在一起,在上一节的基础上进行修改; 1.1、添加清除 bss 段代码, 1.2、添加寄存器结构体 新建一个文件,命名imx6u.h,注意地址的连…

JS手写set与map

目录 setaddhas与equalsdelete迭代器完整实现 map set set是一个没有重复元素的集合,事实上我们无法完全的使用js来模拟出set的全部功能,因为浏览器原生的set底层是使用c实现,能直接访问内存,所以我们只能实现set的一部分功能 这…

Django与mysqlclient链接不成功

先检查自己的python是什么版本,是64位还是32位,这个自己去网上查。 我的是32位的,因为直接pip下载不了,网上也没有32位的whl,所以卸载重装一个64位的3.9.6的python 网上直接搜mysqlclient,找到对应py39也…

WPF2 样式布局

样式布局 WPF中的各类控件元素, 都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment) 等等。 而样式则是组织和重用以上的重要工具。…

ray.tune调参学习笔记1:超参数优化器tuner设置

最近研究中学习使用python的ray.tune进行神经网络调参。在这里记录学习过程中的收获,希望能够帮助到有同样需求的人。学习过程主要参考ray官网文档,但由于笔者使用的ray为2.2.0版本,而官方文档为更高级版本,笔者代码和官方文档代码…

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。 Python实现…

【C 数据结构】图

文章目录 【 1. 基本原理 】1.1 无向图1.2 有向图1.3 基本知识 【 2. 图的存储结构 】2.1 完全图2.2 稀疏图和稠密图2.3 连通图2.3.1 (普通)连通图连通图 - 无向图非连通图 的 连通分量 2.3.2 强连通图强连通图 - 有向图非强连通有向图 的 强连通分量 2.3.3 生成树 - 连通图2.3…

重仓比特币

作者:Arthur Hayes Co-Founder of 100x. 编译:liam ccvalue (下文中表达的任何观点均为作者的个人观点,不应作为投资决策的依据,也不应被视为参与投资交易的建议或意见)。 我们中断牛市常规节目,为您播报这…

【研发管理】产品经理知识体系-产品创新中的市场调研

导读:在产品创新过程中,市场调研的重要性不言而喻。它不仅是产品创新的起点,也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述:市场调研重要性 1、相关概…

华为数字化转型与数据管理实践介绍(附PPT下载)

华为作为全球领先的信息与通信技术(ICT)解决方案提供商,在数字化转型和数据管理领域拥有丰富的实践经验和技术积累。其数字化转型解决方案旨在帮助企业通过采用最新的ICT技术,实现业务流程、组织结构和文化的全面数字化&#xff0…

Kafka 3.x.x 入门到精通(03)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通(03)——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.4.1 生产消息的基本步骤2.4.2 生产消息的基本代码2.4.3 发送消息2.4.3.1 拦截器2.4.3.1.1 增加拦截器类2.4.3.1.2 配置拦截器 2.4.3…

Spring Bean 的生命周期与作用域解析及实战

引言 在Spring框架中,Bean是构成应用的核心组件,它们负责执行应用中的业务逻辑。理解Spring Bean的生命周期和作用域对于开发高效、稳定的Spring应用至关重要。本文将详细解析Spring Bean的生命周期和作用域,并通过实战案例加深理解。 一、…

使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具,比SpeechRecognition功能多安装也很简单; 官方介绍:FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD&#xff…

微软ML Copilot框架释放机器学习能力

摘要:大模型席卷而来,通过大量算法模型训练推理,能根据人类输入指令产生图文,其背后是大量深度神经网络模型在做运算,这一过程称之为机器学习,本文从微软语言大模型出发,详解利用大型语言模型&a…

Java设计模式:使用责任链模式和状态模式优化‘审批流程‘

Java设计模式:使用责任链模式和状态模式优化审批流程 摘要引言 需求流程图正文内容📐 基本概念介绍 功能实现示例1:设计模式:责任链模式方法:好处: 示例2:设计模式:责任链模式方法和操作流程:好…

【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断

实验内容: 1、编写程序,设置主程序:跑马灯以 0.2s 的速度旋转;将 KB1 设置为外部中断,下 降沿触发,按下 KB1 则全彩灯的 R 灯闪烁 5 次。编译、下载程序到开发板,观察实 验现象;按下…

torch.cuda.is_avaliable()在命令行里是true,pycharm是false【省流:换Pycharm】

我的问题: 1、torch.cuda.is_avaliable()在命令行里是true,但是pycharm是false 2、pycharm选择pytorch所在的解释器,加载失败。 3、pytorch所在的解释器加载成功,但是里边的torch包莫名消失。 解决方法: 在调试了很…

Sping源码(七)—context: component-scan标签如何扫描、加载Bean

序言 简单回顾一下。上一篇文章介绍了从xml文件context component-scan标签的加载流程到ConfigurationClassPostProcessor的创建流程。 本篇会深入了解context component-scan标签底层做了些什么。 component-scan 早期使用Spring进行开发时,很多时候都是注解 标…

免费好用各科目的刷题软件

一 、前言 刷题,即通过大量做题来提高解题能力和考试成绩的行为,主要有以下几个好处: 1. 熟悉题型和考试格式 通过刷题,可以对考试中可能出现的题型和格式有更深入的了解,有助于在实际考试中快速识别题目类型和解题…

Java使用IText根据pdf模板创建pdf文件

1.导包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-as…