请教java匿名类内部的局部变量问题

看雪山海间 2016-06-29 10:52:22
java匿名类内部的局部变量只能定义为final,可是在实际工作中还需要改变这个局部变量,请问高手怎么解决呢?
...全文
208 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pangshushuwp 2016-06-30
  • 打赏
  • 举报
回复

import org.junit.Test;

public class Test {

	@Test
	public void test1() {
		final String works = "java";
		String talk = "hello world";
		PersonIntef pi = new PersonIntef() {
			public void say(String msg) {
				System.out.println(msg);
			}
			public void work() {
				System.out.println(works);
			}
		};
		pi.work();
		pi.say(talk);
		talk = "hello java";
		pi.say(talk);
	}
}
interface PersonIntef {
	void say(String msg);
	void work();  
}
家里敷泥呀 2016-06-30
  • 打赏
  • 举报
回复
你可以把它提取成外部类的静态属性。 (这只是其中一种解决方案,具体情况具体分析。)
解开者 2016-06-30
  • 打赏
  • 举报
回复

public class InnerTest {

	public static void main(String[] args) {
		Inner in = new Inner();
		System.out.println(in.i);
		in.test();
		System.out.println(in.i);
	}

	static class Inner {
		int i = 0;

		void test() {
			i = 1;
		}
	}

}
初心勿忘 2016-06-30
  • 打赏
  • 举报
回复
局部匿名类在源代码编译后也是要生成对应的class文件的(一般会是A$1.class这种形式的文件),那么这个二进制文件是独立于其外围类(A.class)的,就是说它无法知道A类中方法的变量。但是A$1.class又确实要访问A类对应方法的局部变量的值。。。怎么办呢? 于是干脆就要求“匿名内部类调用的方法内局部变量必须为final”,这样A$1.class访问A类方法局部变量部分就直接用常量来表示 。 final修饰的局部变量只能被赋一次值,不能修改。
我爱铁板烧 2016-06-30
  • 打赏
  • 举报
回复
引用 1 楼 我爱铁板烧的回复:
final关键字修饰的基本变量即为常量,经构造函数后就不可以改变其值。
哦,对了。如final修饰的成员变量在匿名类中已经声明赋值,可在匿名类的构造函数对其重新赋值。方法体内的变量才叫局部变量,作用域只在该方法内。需要用final修饰吗?
我爱铁板烧 2016-06-30
  • 打赏
  • 举报
回复
final关键字修饰的基本变量即为常量,经构造函数后就不可以改变其值。
我爱铁板烧 2016-06-30
  • 打赏
  • 举报
回复
final关键字修饰的基本变量即为常量,经构造函数后就不可以改变其值。
soton_dolphin 2016-06-30
  • 打赏
  • 举报
回复
引用 8 楼 yiran_ming 的回复:
用数组来装你想要改变的对象 Object[] arr=new Object[2] arr[0]=new Object(); 到时候强转就行了
这种方式极不推荐。楼主还是在想想怎么设计你的内部类吧
  • 打赏
  • 举报
回复
用数组来装你想要改变的对象 Object[] arr=new Object[2] arr[0]=new Object(); 到时候强转就行了

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧