Java的面向对象的代码结构会使在多个位置引用变量更加困难。有时也很难确定给定变量应属于哪个类,尤其是当它是一个广泛使用的值(例如数据库连接器或数学常数)时。

Java全局变量怎么定义?

在许多语言中,当遇到这样的问题时,我们可以声明一个全局变量。但是,不幸的是,Java从技术上不允许在全局范围内创建变量。

在本文中,我们将介绍如何在Java中模拟和使用全局变量。

什么是全局变量?

全局变量是可以从任何范围访问的变量。许多编程语言都具有用于声明全局变量的特殊语法,例如,Python使我们可以使用global关键字:

global a_variable = 5

C通过简单地在函数外部声明变量来创建全局变量。

int aVariable = 3;

int someFunction() {

print(aVariable);

}

无论创建全局变量的语法如何,它们的工作方式大致相同。它们允许您从任何其他类或函数内部访问和修改值。如果您尝试在另一个作用域中重用该名称,则可能导致问题。例如:

int aVariable = 3;

int someFunction() {

int aVariable = 7;

print(aVariable);

}

根据语言,通常以以下三种方式之一来处理:

声明已存在的变量时引发错误。

假设打印语句引用局部变量。

假定print语句引用局部变量,除非使用特殊语法引用全局变量。

第三种方法是当方法参数使用相同名称时Java如何处理实例变量。描绘一个类,该类的变量声明为private int number。要修改以后的值number,您可以创建一个函数:

public int setNumber(int number) {

this.number = number;

}

在this你想要的关键字显示number从类,而不是从方法的参数。

Java为什么不使用全局变量?

这个问题的简短答案是:故意设计。Java被创建为纯粹的面向对象的编程语言,这就是为什么您创建的所有内容都包装在一个类中的原因。

通过纯粹面向对象,鼓励开发人员将相关的变量和函数保持在一起,从而使程序整体上更有条理。这也可以帮助确定文档记录不充分的目的。例如:

class GridCoordinate {

int x;

int y;

}

如果不知道这些变量是GridCoordinate类的一部分,则几乎不可能识别它们。通过类名的上下文,我们可以推断出它们是网格上给定点的水平和垂直位置。

现在想象一下您正在与一个遍布全球的成员组成的完全远程团队一起工作。当您遇到以下问题时,您和另一大陆的同事都在处理同一个文件:

global ver = 2.55

您假设变量代表版本号。您的同事认为这可能与垂直轴有关。你们都根据自己的假设对不同的功能进行了更改,并根据需要修改和引用了该值。

订阅我们的新闻

在收件箱中获取临时教程,指南和作业。从来没有垃圾邮件。随时退订。

订阅电子报

订阅

这是Java试图通过没有全局变量来避免的那种情况。在大型项目中使用全局变量会导致意外和意外的行为,因为在代码的不同部分中声明和修改了变量。

如何在Java中模拟全局变量?

尽管使用全局变量有一些缺点,但有时您可能希望在许多地方访问变量,但是您可能会觉得不保证创建专用包装类。

例如,您可能想在多个类中引用数据库连接,但没有声明一个DatabaseConnection类来处理所有数据库功能。您可能还希望只使用选择的数据库库中的内置方法,而无需使用包装程序来处理事务。

通常,您可以创建一个Constants或一个Reference类,如果各种“全局”值通常在应用程序的其他部分中使用,则可以在其中存储各种“全局”值。单个变量并不一定要保证整个类,因此您可以将多个变量包含在一个Reference或一个Constants类中:

public class Reference {

public static final double VERSION_NUMBER;

public static final String DATABASE_URL;

public static final Database DATABASE;

}

然后可以通过引用该类在其他位置访问这些变量:

public int someMethod() {

System.out.println(Reference.VERSION_NUMBER);

}

使用Reference该类可以很容易地知道在哪里可以找到解释变量目的的注释。如果上面的变量被创建为真正的全局变量,则很可能在不同的文件中创建了它们,这使得查找作者的预期目的变得更加困难。

使用Reference该类的一种更好的方法是将所有变量都视为私有变量,并使用getter方法控制对值的所有访问。对于在程序运行时不应更改的数据,使用常量而不是变量也是明智的。例如:

private static final String DATABASE_URL = "https://databaseurl.db/database";

private static final Database DATABASE = Database.connect(databaseURL);

public static Database getDatabase() { return DATABASE; }

public static String getUrl() { return DATABASE_URL}

在此示例中,无法在代码中的其他任何地方修改数据库URL和数据库连接,但是可以根据需要引用数据库连接以进行事务处理。

虽然这在语法上不像定义全局变量那样干净,但是它可以提供相同级别的自由度。

另一个常见用法是在应用程序中定义一些常量,这些常量具有您经常使用的不可变值。例如,如果您正在训练神经网络或运行遗传算法,那么到处都会使用各种值:

public static final int GENERATION_SIZE;

public static final int GENOME_SIZE;

public static final int REPRODUCTION_SIZE;

public static final int MAX_ITERATIONS;

然后,您将通过他们的公共课程访问这些内容,例如:

for(int i = 0; i < Constants.MAX_ITERATIONS; i++) {

// ...

}

结论

全局变量通常被视为一个分裂的话题,许多开发人员表示,永远不要使用它们。这些开发人员通常认为,全局变量使代码难以维护。但是,在某些情况下,只要全局变量良好地组织并清楚地标识它们,它们就很有用。

最终,使用它们的决定权在您或开发团队的高级成员身上。

分享一些Java基础和进阶的学习资料给大家看看吧!不管是进阶提升还是基础入门都很有用。

下面这些资料可以免费分享给大家学习,文末有免费下载方式!

目录

内容截图

这套文档涵盖的内容实再太过于全面,不论是成长进阶还是应对面试,都绰绰有余了。一共有上百万字,都为大家展示出来肯定是不太现实的,为了不影响大家的阅读体验就只展示了部分内容,还望大家海涵。

需要的小伙伴点击下方名片免费领取。

Java全局变量怎么定义?什么是全局变量?相关推荐

  1. c++全局变量怎么定义_C errno全局变量是否是线程安全的

    在使用多线程时,遇到了一个问题:线程例程中如果需要使用errno全局变量,如何保证errno的线程安全性?例如一个简单的线程池代码: for(int i=0;i<THREADNUM;i++){p ...

  2. C语言——全局变量的定义与声明

    转自: https://www.cnblogs.com/amanlikethis/p/3319744.html C语言中全局变量的定义与声明困扰着许多C语言初学者.本文讲述了全局变量定义与声明的用法, ...

  3. 定义c/c++全局变量/常量几种方法的区别

    在讨论全局变量之前我们先要明白几个基本的概念:  1. 编译单元(模块): 在ide开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(link erro ...

  4. c51语言定义全局变量,全局变量的定义和使用

    在用VB开发软件时,经常需要在不同的窗体间共享数据,但在过多的使用全局变量时不便于软件的调试和修改.通常有两种解决方法. 第一种方法:定义全局变量,然后在各个窗体中直接使用,例如 Public str ...

  5. 当心在Lib中定义非const全局变量

    当心在Lib中定义非const全局变量 Posted on 2011-08-15 16:33 单鱼游弋 阅读(306) 评论(0) 编辑 收藏 一般我们在全局作用域定义全局变量来进行模块间(函数之间. ...

  6. java不建议用全局变量吗_不要使用全局变量, ThreadLocal也不行

    不要使用全局变量的道理大家都懂,基本上在大家学习编程过程中很早就会被教育到,但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量,只不过这些全局变量会穿上马甲,让你不会一下看穿它的巨大危害,这里就讲 ...

  7. 每日一题(29)—— 如何引用一个已经定义过的全局变量

    如何引用一个已经定义过的全局变量? extern关键字 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间 ...

  8. vue全局变量的 定义与任意调用

    vue全局变量的 定义与任意调用 首先: 在main.js文件中定义全局变量的代码,举例示下: 参考文章:https://www.cnblogs.com/weibanggang/p/11368615. ...

  9. vue (可读写)全局变量的 定义、任意调用、值的修改

    vue (可读写)全局变量的 定义.任意调用.值的修改 定义截图: 简单了解: 官方文档:处理边界情况 (在每个 new Vue 实例的子组件中,其根实例可以通过 $root property 进行访 ...

最新文章

  1. 软件工具将GPU代码迁移到fpga以用于AI应用
  2. 堡垒机的使用-及功能
  3. python opencv 如何检测模糊图像?自动判断模糊程度 cv2.Laplacian().var()
  4. 解决oracle语句中 含数字的字符串按数字排序问题
  5. c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...
  6. 如何使用MaxCompute Spark读写阿里云Hbase
  7. 互联网金融数据分析-笔记
  8. java自学难点_学习JAVA遇到的难点总结
  9. oracle主要的动态视图与基表的对应关系
  10. 分类问题损失函数的信息论解释
  11. tomcat下载安装及配置教程
  12. RYYB图像格式学习
  13. handlersocket php,mac编译安装php的handlersocket扩展
  14. 第一个彻底解决!微信公众号数学公式排版
  15. 陕西勉县旅游策划方案——打造三国之都!
  16. python判断火车票座位_利用Python实现命令行版的火车票查看器
  17. 在服务端录制语音视频
  18. android雪花飘落动画,Android自定义View——从零开始实现雪花飘落效果
  19. 理财就是理生活 —— 小白理财训练营(下)
  20. 解决Macm苹果笔记本电脑白屏

热门文章

  1. ELK性能优化实战总结:我凭着这套“神级PDF文档”吊打面试官
  2. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day4】 —— 数据库1
  3. Java 208道面试题及部分答案
  4. java如何实现群聊,用Java控制台实现简单的群聊天室
  5. WebSocket刨根问底(三)之群聊
  6. python 多进程同步运行多个函数
  7. 转:领导力的核心是让每个人得以蓬勃发展
  8. 全景视频拼接关键技术
  9. 三个关于采购的小故事,真是绝了!
  10. c# 多个chart 纵坐标轴范围鼠标滚轮放大和缩小,拖动横纵坐标十字光标查看数据。