什么鬼!局部内部类,

沁海棠 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。
啥意思。给个例子。
...全文
337 点赞 收藏 6
写回复
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
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告