java 不能引用另一方法中定义的内部类中非终态变量

Java中,内部类不能直接引用方法中的非final局部变量,因为方法执行完毕后变量可能被垃圾回收,而内部类可能还在使用。为解决这个问题,可以将变量声明为final或转化为外部类的成员变量。

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

package com.study;


public class Test {
	
	  public void test01(){
		   String m = "外部定义的方法";
		   class Test02{
			   public Test02() {
				   System.out.println(m);
			   }
			   
		   }
	  }
	  
	  public static void main(String[] args) {
		
	}
	
	
}

如上代码报错为:Cannot refer to the non-final local variable m defined in an enclosing scope 中文为:

 

不能引用封闭范围中定义的非最终局部变量m

原因如下:

内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。

 

可以将要引用的变量定义为final 或者外部类的成员变量。来防止内部类调用改变量时,已经被GC了

package com.study;


public class Test {
	private String m = "外部定义的方法";
	
	  public void test01(){
		 // final String m = "外部定义的方法";
		   class Test02{
			   public Test02() {
				   System.out.println(m);
			   }
			   
		   }
	  }
	  
	  public static void main(String[] args) {
	}
	
	
}

这种错误一般的场景为,在A方法中使用 new Test(){} ,Test为接口 ,在Test接口中要实现抽象方法,而抽象方法中需要调用内部类之外A方法中的变量。为了不报错。可以使用上面的场景,将变量定义为final或者外部类的成员变量,同时在外部类的构造方法中赋值。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值