您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java变量作用域的这4条铁规

时间:2019-08-16 11:09:37  来源:  作者:

声明

本文有牛旦教育原创,首发头条,转载请注明来源,所有权保留。

我们知道类中的成员(包括静态和非静态的字段和方法)作用域对外(不同的包和不同的类)是依赖类的访问控制等级的,对内(同类内)则都可访问。因为类成员变量对类来说是全局变量,即在成员变量定义的代码块(类)内都是有效的。除了全局变量,还有局部变量。本文的4条规则,主要是针对局部变量而言的。

提示:关于类成员访问控制等级——也有称为访问权限的,在JAVA中有4类,每个成员的访问等级只能选择其中的一种。如下下表所示:

细微处见真章:Java变量作用域的这4条铁规须谨记

表1:类中的成员访问级别

所谓局部变量,就是在方法、构造函数或块中声明的变量。在方法中声明的局部变量仅在方法执行期间存在。由于局部变量仅存在临时的持续时间,因此不能在方法、构造函数或声明块的外部使用。方法的形式参数被视为局部变量。当方法被调用时,以及在执行方法的主体之前,它们都使用实际的参数值进行初始化。编码时,我们需要遵守以下有关使用局部变量的规则。

细微处见真章:Java变量作用域的这4条铁规须谨记

 

规则#1

局部变量默认情况下未初始化。请注意,此规则与实例/类变量初始化的规则相反。当声明一个实例/类变量时,它会使用默认值进行初始化(自动初始化)。来看下面add()方法的以下部分定义:

	int add(int n1, int n2) {
	 int sum;
	 /* sum的值是设么? 不知道,因为还没初始化它. */
	 /* 其它代码... */
	}

规则#2

这条规则是第一条规则的分支。 在程序分配一个值之前,局部变量不能被访问。 下面的代码片段会产生编译时错误,因为它会在分配值之前尝试打印本地变量sum的值。 请注意,Java运行时必须读取(或访问)sum变量的值才能打印它。

	int add(int n1, int n2) {
	int sum;
	// 编译时错误. 不能读取sum 值,因为还没被赋值.
	System.out.println(sum);
	}

下面的代码段编译良好,因为局部变量sum在被读取前已被初始化:

	int add(int n1, int n2) {
	int sum = 0;
	System.out.println(sum); // 编译运行正常,输出 0
	}

规则#3

局部变量可以在方法体内的任何地方声明。 但是,它必须在使用之前进行声明。 这条规则的含义是,你不需要在方法体的开头声明所有的局部变量。 在更靠近使用变量的地方来声明变量是一个好习惯。

局部变量不允许同名。其实,同一代码块内(不含内嵌代码块)也不允许变量同名,而不论是否是不同类型。

规则#4

局部变量隐藏实例变量和具有相同名称的类变量的名称。何为隐藏?就是说在类内定义了成员变量name,又定义了局部变量name,再在方法体或代码块使用name变量,则程序会自动选择“最近”定义的变量name。也就是说同名的变量名,会以局部变量为准来参与相关的逻辑处理。如果本想使用成员变量的,这么一来,结果可能不是想要的。

隐藏这一现象适用于所有代码块,即小区块代码内的局部变量,会隐藏大区块同名的变量。

变量作用域示例:

 public class VariableScope{
 private static int varNumber = 4 ;
 
 static void SayNumber(int varNumber){
 System.out.println("SayNumber(int varNumber):"+varNumber) ;
 int varNum = 2 ;//只能方法内使用
 System.out.println("Another varNum:"+varNum) ;
 }
 public static void main(String[] args){
 int varNumber = 9 ;
 SayNumber(varNumber) ;
 {
 int varNum = 3 ;
 System.out.println("Block Code:"+ varNum) ;
 }
 //System.out.println("block variable varNum(3):"+varNum) ;//编译错误
 System.out.println("main 内(9):"+varNumber) ;
 }
}

其实,所有的变量作用域都是跟Java的JVM内部管理机制以及内存模型有关的,这里就不展开了,前面有文章说过这些,有兴趣的可以去看看:



Tags:Java 变量作用域   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
我们知道类中的成员(包括静态和非静态的字段和方法)作用域对外(不同的包和不同的类)是依赖类的访问控制等级的,对内(同类内)则都可访问。因为类成员变量对类来说是全局变量,即在成员变量定义的代码块(类)内都是有效的。除了全局...【详细内容】
2019-08-16  Tags: Java 变量作用域  点击:(199)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条