全局变量和局部变量同名时操作

本文通过实例详细介绍了局部变量和全局变量的概念及作用域。解释了当局部变量名称与全局变量相同的情况时如何通过this关键字访问全局变量。

局部变量和全局变量的名词解释

局部变量:作用域作用一个方法或者一个代码块里面的变量。

全局变量:作用域为整个类,类里面的所有方法都能使用这个变量(全局变量不用进行初始化,它具备自动初始化的功能)。

这里需要说明的是:如果局部变量的名字和全局变量的名字是一样的,全局变量会被隐藏,如果要将全局变量显示出来,则需要在前面加上this修饰词。下面结合一个列子来说明这点内容。

<span style="font-size:14px;color:#3333ff;background-color: rgb(192, 192, 192);">public class Test {
	private int x=1;
	private int y=1;
	private int z=1;
	
	void changeVar(int a,int b,int c){
		x=a;//给全局变量赋值
		int y=b;//y使同名全局变量隐藏
		int z=9;//z使同名全局变量隐藏
		System.out.println("In changeVar:"+"x="+x+"y="+y+"z="+z);
		//结果是In changeVar:x=10y=10z=9
		this.z=c;//给全局变量z赋值
	}
	String getXYZ(){
		return "x="+x+"y="+y+"z="+z;
	}
	
	public static void main(String[] args) {
		Test t=new Test();
		System.out.println("Before changeVar:"+t.getXYZ());
		// 结果是Before changeVar:x=1y=1z=1
		t.changeVar(10, 10,10);
		System.out.println("After changeVar:"+t.getXYZ());
		//结果是After changeVar:x=10y=1z=10
	}
}</span>

分析一下这输出的结果

  • 最先输出的是Before changeVar: x=1 y=1 z=1这一行,结果全局变量一开始的初始化的值;
  • 接着输出是In changeVar: x=10 y=10  z=9这一行内容,因为在调用这个changeVar()方法的时候给全局变量赋值了,给局部变量也赋值,但是x,y因为和全局变量同名,而c本身一开始就赋值为9,所以结果是这样;
  • 最后输出After changeVar: x=10 y=1 z=10这一行,输出x为10,是因为在调用 changeVar() 这个方法的给x赋值为10,隐藏了全局变量,而此时输出x在方法中已经变为10,y为1是因为他是全局变量y,c为10的原因是成员变量z隐藏全局变量,但是this修饰词又调用本类的全局变量z。


附注--如果有什么值得修改的不到之处,还请指正。



### 全局变量局部变量同名的作用域优先级行为分析 在编程语言中,作用域决定了变量的可见性生命周期。当全局变量局部变量同名,作用域规则会决定哪个变量会被优先使用。以下是关于全局变量局部变量同名的行为作用域规则的详细分析。 #### 1. 局部变量优先级高于全局变量 当一个局部变量全局变量同名,在局部变量的作用域内,局部变量会**屏蔽**全局变量[^1]。这意味着在局部作用域中,程序将优先访问局部变量,而不会访问同名全局变量。 例如,在C语言中: ```c #include <stdio.h> int a = 10; // 全局变量 int main() { int a = 20; // 局部变量 printf("局部变量a: %d\n", a); // 输出 20 return 0; } ``` 在上述代码中,`printf` 函数中的 `a` 是局部变量,因此输出结果为 `20` 而非全局变量的值 `10`[^1]。 #### 2. 访问被屏蔽的全局变量 尽管局部变量会屏蔽全局变量,但在某些语言中仍然可以通过特定的方式访问全局变量。例如,在C语言中,可以使用 `global` 关键字(虽然C语言本身没有直接的 `global` 关键字,但可以通过指针或明确指定地址来访问全局变量)[^3]。 以下是一个示例: ```c #include <stdio.h> int a = 10; // 全局变量 int main() { int a = 20; // 局部变量 printf("局部变量a: %d\n", a); // 输出 20 printf("全局变量a: %d\n", ::a); // 在C++中可使用 :: 操作符访问全局变量 return 0; } ``` 注意:在C语言中无法直接通过 `::` 操作符访问全局变量,但可以通过指针或其他方式间接访问。 #### 3. 变量提升对作用域的影响 在JavaScript等语言中,变量提升可能会导致同名变量的行为更加复杂。例如,如果在函数内部声明了一个全局变量同名局部变量,但由于变量提升的原因,该局部变量可能在声明之前就已经存在,但未初始化,从而导致 `undefined` 的结果[^5]。 以下是一个JavaScript示例: ```javascript var val = 10; // 全局变量 function test() { console.log(val); // undefined,因为局部变量val被提升但未初始化 var val = 100; // 局部变量 console.log(val); // 100 } test(); ``` #### 4. 不同语言中的行为差异 不同编程语言对全局变量局部变量同名的行为处理可能有所不同。例如,在C语言中,局部变量会完全屏蔽全局变量;而在JavaScript中,变量提升可能导致未定义行为[^4]。 #### 5. 总结 - 局部变量的优先级高于全局变量,在局部作用域内会屏蔽全局变量。 - 在某些语言中,可以通过特定方式(如C++中的 `::` 操作符)访问被屏蔽的全局变量。 - 变量提升可能会导致局部变量的行为更加复杂,尤其是在JavaScript等动态语言中。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值