请问:inner class中使用的参数为什么必须为final啊?

hanxiao19811230 2007-03-27 11:02:22
interface A {
void f();
}

class B {
public A m(final int a) {
return new A() {
int b = a;
void f() {};
}
}
}
请问 final int a, 为什么必须是final
...全文
337 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shengli_liao 2007-03-28
  • 打赏
  • 举报
回复
xuexi....
qzjackie 2007-03-28
  • 打赏
  • 举报
回复
是的。你也可以自己敲一下。代码。试一下。就清楚了。
class Gizmo{
public void sppin(){}
}
public class FinalArguments{
void with(final Gizmo g){
//不能 g=new Gizmo();
}
void without(Gizmo g){
g=new Gizmo();//这里就是可以的哦。
}
}
kingofworl 2007-03-28
  • 打赏
  • 举报
回复
一种规范 怕乱引用
hanxiao19811230 2007-03-28
  • 打赏
  • 举报
回复
还是不太明白
maquan 2007-03-28
  • 打赏
  • 举报
回复
to yiyi2007():

大概是文字翻译方面的问题。在《Java Language Specification》中有两个词,nested class 和 inner class,是有区别的。

楼主说的应该是 inner class,而你上面说的这个“内部类”好像是指 nested class。
yiyi2007 2007-03-28
  • 打赏
  • 举报
回复
二楼说“1.内部类不允许静态修饰(包括静态域,方法,静态初始化)”

有点问题。

内部类可以使用public,protected,default,private等4种访问权限控制

内部类可以被声明为static(普通类是不可以的),这样的内部类变成顶层类,相当于把它放在外面,不再是嵌套的内部类,不能再引用外包类对象。

顶层类可以声明static成员。如果内部类需要定义static成员,则该内部类必须声明为static,否则,一般内部类的成员不能被声明为static.


以上文字是书中的原话。
yiyi2007 2007-03-28
  • 打赏
  • 举报
回复
楼主的代码,我敲到MyEclipse中,编译的通不过,在B类中的f(){}这句会出现红色波浪线。

而且楼主还将代码写成 void f() {}; 这里加上分号本来就是错的
www203 2007-03-27
  • 打赏
  • 举报
回复
内部类使用注意事项:
这里不考虑静态内部类,因为没有什么特别的限制
1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
2.内部类可以直接访问外围类的方法。
3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。这样做是为了规范内部类的行为.

这是出于变量作用域的限制考虑. 内部类能使用的变量局限于内部类里面声明的变量, 一般情况下不能使用外面的. 但如果外部变量被声明为final的, 就相当于是一个全局变量, 它的生命周期就扩展到内部类里面了, 因此可以访问.
加final修饰符是为了防止该变量指向其他引用,比如你将这个变量指向null而外部类却毫不知情的继续在使用这个null的变量
frilly 2007-03-27
  • 打赏
  • 举报
回复
内部类使用注意事项:
这里不考虑静态内部类,因为没有什么特别的限制
1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
2.内部类可以直接访问外围类的方法。
3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。这样做是为了规范内部类的行为.

这是出于变量作用域的限制考虑. 内部类能使用的变量局限于内部类里面声明的变量, 一般情况下不能使用外面的. 但如果外部变量被声明为final的, 就相当于是一个全局变量, 它的生命周期就扩展到内部类里面了, 因此可以访问.
加final修饰符是为了防止该变量指向其他引用,比如你将这个变量指向null而外部类却毫不知情的继续在使用这个null的变量




62,614

社区成员

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

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