[JavaEE基础 局部内部类访问外部类当前方法中的局部变量

本文详细解析了Java内部类的概念,包括内部类如何在外部类内部定义,以及局部内部类如何访问外部类方法中的局部变量。阐述了局部变量在内部类访问时必须被声明为final的原因,以及JVM处理变量的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内部类

概念:在一个类的内部再定义一个完整的类。与实例变量相、实例方法同级别的类。

下面就是一个内部类的案例

public class testOne {

	public static void main(String[] args) {
		Outer out = new Outer();
		
		Outer.Inner in = out.new Inner();
		
		in.m2();

	}

}

class Outer{**//外部类**
	int a = 10;//外部类实例变量
	
	public void m1() {
		
	}
	
	
	class Inner{//内部类
		int b = 20;//内部类实例变量
		
		public void m2() {
			System.out.println(Outer.this.a);
			System.out.println("Class Inner m2()");
		}
	}
}
二、局部内部类访问外部类当前方法中的局部变量

局部类访问外部类当前方法中的局部变量时,因无法保障变量的声明周期与自身相同,变量必须修饰为 final

在开展这方面之前你要了解一些关于JVM处理变量的知识。
在这里插入图片描述
下面是一个案例

public class testInner {

	public static void main(String[] args) {
		
		Outer out = new Outer();
		
		out.mc1();
		

	}

}

class Outer{
		
	public void mc1() {
		
		int a = 20;//方法中的局部变量
		
		class Inner{
			
			public void mc2() {
				//a = 30;
				//当局部内部类访问外部常量时,默认将外部常量添加final,所以“a = 30”部分代码运行时一定错误。
				System.out.println(a);
			}	
			
		}
		Inner in = new Inner();
		in.mc2();
		
	}
}

在代码里面Inner类的方法mc2中,可以明显看到不能更改 a 的值。如果更改就会报错,此时错误类型就会显示:

Local variable a defined in an enclosing scope must be final or effectively final

查找错误原因就是因为,在内部类“Inner”中,访问外部类“Outer”方法中的变量“a”时,JVM会默认在 “int a = 20”的前面加上“final”关键字,使之成为一个常量。

原因就是因为,上图中JVM垃圾处理的运行机制。

mc1 方法中的局部变量 a,在此方法结束之后本应被回收。但是因为内部类 Inner 中的 mc3 方法调用了局部变量 a。这时局部变量 a,不能被回收,所以虚拟机默认将变量 a添加修饰符“final”,使变量 a,变为常量,这样本应该收回的变量 a,为了顺应方法调用变为常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值