2 u010880786 u010880786 于 2016.03.30 10:42 提问

内部类传值给外部类时为什么可以用对象数组来存放要传的值呢?

比如说下列代码
方法1 – 对象数组法通过一个final的Object对象数组,存放需要的值
public long countUser(final String userType) {
final Object[] objs = new Object[1];
Trans.run(new Atom(){
public void run() {
objs[0] = dao.count(User.class, Cnd.where('userType', '=', userType));
}
});
return ((Number)objs[0]).longValue();
}
为什么不能直接返回final以后的对象值呢?为什么一定要放在数组里才可以取得到呢?

1个回答

wswzh0329
wswzh0329   2016.03.30 11:01
已采纳

。。这个匿名内部类在方法中,是方法匿名内部类,方法调用结束后所有的局部变量,内部类对象,数组(也相当于对象)都失效(变量没了,也就没有引用指向对象,对象会被回收),final定义的变量放在常量池中,有效范围是整个外部类,用final修饰的引用objs不会被回收,那么它指向的数组也就不会被回收,可以被外部类访问到,那么内部类的值也就能传递出来,所以重点应该是final的作用而不是对象数组吧, ps:我也是新手,你就随便参考一下就好,没看懂你的Atom内部类是什么作用

u010880786
u010880786 回复wswzh0329: 谢谢,谢谢,你解释的太认真了!真好!
一年多之前 回复
wswzh0329
wswzh0329 。。这破网愁死我了!!! 你问的为什么要用数组来传递,是因为每个变量跟数组都有生命周期,要实现传递,你传递的东西必须在作用域内才能保证活着,你才能拿到,final就是将变量的作用域变大,在内部类和countUser()方法都不存在的情况下,objs还能存在,也就是你想要传递的对象的引用还存在,你就能通过访问objs来找到对象!! ps:我也没有理解透,所以只能废话一大堆试着解释 嘿嘿
一年多之前 回复
wswzh0329
wswzh0329 回复香辣鸡丁煲: 。。final是一个修饰,是说明这个变量能够使用的范围,或者说这个变量的使用域。按我目前学到的,内存分为三个区:堆内存,栈内存,方法区;简单点说就是变量在栈内存中分配,对象在堆内存中分配,每个对象都会有一个内存地址值,引用对象都是等于地址值。比如你这个例子中,new Object[1] 在堆内存中分配一个空间并生成一个地址值0x3d4f,而变量objs=0x3d4f(地址值),所以每次使用objs的时候,都会得到一个地址,根据该地址找到对象从而使用该对象。
一年多之前 回复
wswzh0329
wswzh0329 回复香辣鸡丁煲: 。。final是一个修饰,是说明这个变量能够使用的范围,或者说这个变量的使用域。按我目前学到的,内存分为三个区:堆内存,栈内存,方法区;简单点说就是变量在栈内存中分配,对象在堆内存中分配,每个对象都会有一个内存地址值,引用对象都是等于地址值。比如你这个例子中,new Object[1] 在堆内存中分配一个空间并生成一个地址值0x3d4f,而变量objs=0x3d4f(地址值),所以每次使用objs的时候,都会得到一个地址,根据该地址找到对象从而使用该对象。
一年多之前 回复
wswzh0329
wswzh0329 回复香辣鸡丁煲: 。。final是一个修饰,是说明这个变量能够使用的范围,或者说这个变量的使用域。按我目前学到的,内存分为三个区:堆内存,栈内存,方法区;简单点说就是变量在栈内存中分配,对象在堆内存中分配,每个对象都会有一个内存地址值,引用对象都是等于地址值。比如你这个例子中,new Object[1] 在堆内存中分配一个空间并生成一个地址值0x3d4f,而变量objs=0x3d4f(地址值),所以每次使用objs的时候,都会得到一个地址,根据该地址找到对象从而使用该对象。
一年多之前 回复
u010880786
u010880786 哦我懂了,因为数组被final保存的是地址,而普通类的对象保存的不是地址所以传不了是吗?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!