什么鬼!局部内部类,

沁海棠 2017-04-26 06:24:26
public class Outer {
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.getInner("Inner", "gz");
System.out.println(inner.getName());
}

public Inner getInner(final String name, String city) {
return new Inner() {
private String nameStr = name;

public String getName() {
return nameStr;
}
};
}
}

//注释后,编译时提示类Inner找不到
/* interface Inner {
String getName();
} */
同时在这个例子,留意外部类的方法的形参,当所在的方法的形参需要被内部类里面使用时,该形参必须为final。

不懂什么意思,编译报错,类找不到然后在加了个Inner类
class Inner{
private String name;
private String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}

}

删掉final修饰不报错啊

匿名内部类传递参数的时候,若该形参在内部类中需要被使用,那么该形参必须要为final。也就是说:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。
啥意思。给个例子。
...全文
428 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨曦遇晓 2017-05-03
  • 打赏
  • 举报
回复
简单的说 就是变量的位置一般都在栈区,而对象的位置在堆区,但是加了final之后,变量的位置就由原来的栈区转移到了堆区,这是一个安全机制。目的就是让两者的生命周期保持一致,否则会发生,栈区的变量被CG回收,而堆区的对象正好又使用了被回收的变量造成的问题。
HinanaiTenshi 2017-04-29
  • 打赏
  • 举报
回复
传递给匿名内部类使用的参数,类型必须带有final修饰。 原因是匿名内部类编译之后其实是一个独立的类,两者在内存上是隔离的,传递给匿名内部类的参数,其实是被jvm复制了一份,为了保证匿名内部类按预期的方式使用参数,就需要保证参数不可重新赋值。 不仅是匿名内部类,很多其他形式的内部类都有这个特点。 当然也有很多办法绕开这一点,比如用对象或者数组包装一下你要传递的参数。
沁海棠 2017-04-29
  • 打赏
  • 举报
回复
引用 2 楼 yqj2065 的回复:
想问什么? 1. new Inner()创建匿名类对象,没有父类Inner怎么行; 2.生命周期原因,形参必须为final。在Java8中,可以省略final,但是你不得赋值——事实上的final。
方法内部创建对象访问方法的参数,该参数必须是final是这个意思么?是不是下面代码的情况?java8可以省略? public class InerClass { public a test( final String str){ return new a (){ @Override public void print() { System.out.println(str); } }; } } interface a{ public void print(); }
yqj2065 2017-04-29
  • 打赏
  • 举报
回复
匿名内部类要使用的外面的变量,都必须是事实上的final。
引用 3 楼 qinhaotong 的回复:
public class InerClass { public a test( final String str){ return new a (){ @Override public void print() { System.out.println(str); } }; } } interface a{ public void print(); }
yqj2065 2017-04-28
  • 打赏
  • 举报
回复
想问什么? 1. new Inner()创建匿名类对象,没有父类Inner怎么行; 2.生命周期原因,形参必须为final。在Java8中,可以省略final,但是你不得赋值——事实上的final。
baidu_38353313 2017-04-27
  • 打赏
  • 举报
回复

62,634

社区成员

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

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