涨知识-关于局部内部类访问局部变量

局部内部类访问局部变量的问题


局部内部类访问局部变量必须用final修饰
局部内部类在访问它所在方法中的局部变量必须用final修饰,为什么?
因为当调用这个方法时,局部变量如果没有final修饰,它的生命周期和方法的生命周期是一样的,
当方法弹栈时,这个局部变量也会消失。
那么如果局部内部类对象还没有马上消失,想用这个局部变量时,就没有了。如果用final修改时,
会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用。

但jdk1.8取消了这个规则。可以认为是个bug。

class Demo1_InnerClass {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();	//当调用method()方法时,就创建Inner对象,执行print方法
	}
}

class Outer {
	public void method() {
		//局部内部类。同局部变量一个意思。只在该方法内有效,出了该方法就访问不到该类。
		//局部内部类,只能在其所在的方法中访问。
		class Inner {
			public void print() {
				System.out.println("Hell Inner");
			}
		}
		
		Inner i = new Inner();
		i.print();
	}
}
-------------------------------------------------
class Outer {
	public void method() {

		final int num = 10;	//jdk1.8以前版本,必须要用final修饰,否则报错	

		//局部内部类。同局部变量一个意思。只在该方法内有效,出了该方法就访问不到该类。
		//局部内部类,只能在其所在的方法中访问。
		class Inner {
			public void print() {
				System.out.println(num);
			}
		}
		
		Inner i = new Inner();
		//这里的print也是用到method里面的num
		i.print();
	}
}
如果每个final会报错,因为后面那个用到method里面的i
如果是常量可以直接去常量池找
如果不是在在对应栈找,但是那个method栈已经弹出了,对应i变量也没了
不过jdk1.8后就不用担心这个问题了,好像会自动添加?

int num的生命周期和method()方法的生命周期是一样。
当method()方法出栈之后,new Inner()对象仍然想使用int num,就无法使用了。

常量池:是方法区的一部分。final修饰的变量是常量,进入常量池,不在栈中。
常量池的作用:延迟变量的生命周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值