Java变量和对象的作用域

发布时间 - 2026-01-11 00:24:14    点击率:

大多数程序设计语言都提供了“作用域”(Scope)的概念。

对于在作用域里定义的名字,作用域同时决定了它的“可见性”以及“存在时间”。在C,C++和Java里,作用域是由花括号的位置决定的。

变量的作用域

例子:

{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q “out of scope” */
}

Java用一对大括号作为语句块的范围,称为作用域,作为在作用域里定义的一个变量,它只有在哪个作用域结束之前才可使用。

在Java中不能像下面这样书写代码:

 {
   int x = 12;
   {
     int x = 96; /* illegal */
   }
 }

Java编译器会认为变量已被定义,所以作用域中的变量不能重复定义,但是在C和C++中能将一个变量“隐藏”在一个更大的作用域里,在C和C++中被允许,在Java中是不允许的,因为Java的设计者认为这样做使程序产生了混淆。

再来看两个例子,为了让大家看到效果这里使用截图的方式:

我们再来看这段代码,大家思考一个问题,第11行和第12行为什么没有语法错误?代码如下:

如果我们交换一下位置呢,代码如下:

离开作用域,变量所分配的内存空间将被JVM回收,所以语法不会有错误,而第二种写法name并没有离开{}作用域,所以会语法错误。

上述的变量都是局部变量,那么如果是在有全局变量的情况下又是怎样一种结果呢?我们来用代码说话,代码如下:

大家仔细的观察并结合代码思考,可以得出变量的作用域结论如下:

在同一作用域范围的包裹下全局变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局部变量不可以变量名相同(作用域内不能重复命名),使用变量的时候如果不指明使用全局变量还是局部变量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,那么则可以重复命名此变量,并使用最新定义的这个局部变量。

对象的作用域

Java对象不具备与朱类型一样的存在时间。用new关键字创建一个Java对象的时候,它会超出作用域的范围之外。所以假若使用下面这段代码:

 {
   String s = new String("a string");
 } /* 作用域的终点 */

那么句柄s,也就是引用会在作用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,我们没有办法继续使用这个对象,因为指向它的唯一一个句柄已经超出了作用域的边界。

这样造成的结果是:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C和C++里特别突出。在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,所以在需要对象的时候,根本无法确定它们是否可用。而且最麻烦的是,在C++里,一旦完成工作,必须保证将对象手动清除。

这样便带来了一个有趣的问题。假如 Java 让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”呢。在 C++里,这个问题最令程序员头痛。但 Java 以后,情况却发生了改观。 Java 有一个特别的“垃圾收集器”,它会查找用 new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地创建对象,一旦不再需要它们,它们就会自动离去。这样做可防止在 C++里很常见的一个编程问题:由于程序员忘记释放内存造成的“内存溢出”。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# java变量的作用域  # java对象的作用域  # Java中继承、多态、重载和重写介绍  # java方法重载示例  # 解析Java继承中方法的覆盖和重载  # Java方法的可变参数类型实例分析  # 浅谈Java中的可变参数  # Java中支持可变参数详解  # Java的访问修饰符与变量的作用域讲解  # JavaBean四个作用域范围的详解  # 简单介绍Java 方法的重载、可变参数、作用域  # 这段  # 它会  # 变量名  # 就会  # 句柄  # 这样做  # 再来  # 的是  # 都是  # 全局变量  # 是在  # 依然故我  # 又是  # 是由  # 不可以  # 已被  # 只需  # 更大  # 会在  # 这个问题 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Laravel如何实现API资源集合?(Resource Collection教程)  EditPlus中的正则表达式 实战(2)  百度浏览器如何管理插件 百度浏览器插件管理方法  微信推文制作网站有哪些,怎么做微信推文,急?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  iOS中将个别页面强制横屏其他页面竖屏  北京网站制作公司哪家好一点,北京租房网站有哪些?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何用已有域名快速搭建网站?  详解jQuery中的事件  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何用搬瓦工VPS快速搭建个人网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  如何用AWS免费套餐快速搭建高效网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  详解阿里云nginx服务器多站点的配置  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何快速重置建站主机并恢复默认配置?  javascript基于原型链的继承及call和apply函数用法分析  动图在线制作网站有哪些,滑动动图图集怎么做?  详解MySQL数据库的安装与密码配置  如何快速搭建二级域名独立网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  浅谈Javascript中的Label语句  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Android自定义控件实现温度旋转按钮效果  佛山企业网站制作公司有哪些,沟通100网上服务官网?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  桂林网站制作公司有哪些,桂林马拉松怎么报名?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  canvas 画布在主流浏览器中的尺寸限制详细介绍  使用Dockerfile构建java web环境  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Android 常见的图片加载框架详细介绍