java类方法中使用内部类的参数问题

1.问题:

public class Test{
	private int a = 1;
	static int b = 2;
	public void method(){
		final int c = 3;
		int d = 4;
		class Cinner {	
			public void mymethod(){
				//Here		a、b、c、d哪些参数可以调用
			}
		}
	}
}


一般理解:Cinner类可以调用adcd四个参数,当是受到java技术的限制

答案为:abc  

内部类参数必须为final类型


2.原因:

局部变量的生命周期与局部内部类的对象的生命周期的不一致性!

设方法method()被调用后,在栈中生成了变量d,此时产生了一个局部内部类Cinner,它访问了局部变量d,当方法methos()结束时,局部变量d就会死亡,但局部内部类对象Cinner还可能一直的存在(当没有人再引用该对象时,它才会死亡),它不会随着方法method()运行结束死亡,这时就出现了一个错误结果,局部内部类对象Cinner要访问一个已经不存在的局部变量d

3.java中解决方法:


当变量是final时,通过final局部变量“复制”一份,复制品直接作为局部内部中的数据成员,当局部内部类访问局部变量时,其实真正访问的是这个局部变量的“复制品”,因此就算当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(真正访问为“复制品”),给人感觉好像局部变量的生命期延长了。

4.总结:

这个规定是一种无可奈何,同时也说明程序语言的设计时受到实现技术的限制的,这就是一个例子,大家更多关心的是如何设计和思考,对于技术上的实现觉得无关紧要,只要设计好,都能实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值