黑马程序员技术交流社区
标题:
有关一个匿名内部类的问题
[打印本页]
作者:
wdtdcm
时间:
2014-2-27 10:44
标题:
有关一个匿名内部类的问题
class Outer{
int x=3;
/*
class Inner extends Abs{
void show(){
System.out.println(x);
}
}
*/
public void function(){
//new Inner().show();
//int x=9;//为什么定义这里时要加final修饰.
new Abs(){
int x=9;//为什么定义在这里可以呢?
void show(){
System.out.println(x);
}
}.show();
}
}
abstract class Abs{
abstract void show();
}
class NiNei2{
public static void main(String[] args){
new Outer().function();
}
}
复制代码
作者:
谭荣强
时间:
2014-2-27 11:25
不知道你的问题是不是注释的那部分。
1.//int x=9;//为什么定义这里时要加final修饰. 将x=9定义final,表示x在function()中是一个固定不变的常量9,至于为什么要用final修饰,应该是毕老师要演示内部类的一些调用规则。
2.int x=9;//为什么定义在这里可以呢? new Abs(){
int x=9;
void show(){
System.out.println(x);
}
}.show(); 是一个匿名内部类,里面当然可以定义自己变量x啊,只不过作用域不同
作者:
乔青山
时间:
2014-2-27 12:47
本帖最后由 乔青山 于 2014-2-27 12:58 编辑
这个是生命周期的原因,有好多同学问过这个问题(其实你可以直接查阅一下):
定义在方法中时,运行这个方法会出现这种情况:
1.方法的局部内部类的一个对象在运行。
2.方法同时也在运行。
那这个时候是没问题的,但是:
当方法运行完毕后,方法中的局部变量会出栈,也就是说内存中没有这个变量了。
这个时候局部内部来还是在运行,而且还调用了方法中的变量,但是这个变量已经出栈了,所以就错误了。
而声明为final呢,这个局部变量会变为常量,存在于常量池中(你可以把他理解为方法中的静态属性)。
那这个局部变量就不会因为方法的结束而在内存中消失了,局部内部类才可以调用他。
作者:
乔青山
时间:
2014-2-27 12:50
至于你说
int x=9;//为什么定义在这里可以呢?
这句就是定义在内部类中的变量,跟平时写的成员变量差不多。
换句话说,你写在内部类里就属于内部类了,不属于外部方法了(当然方法可以调用他)。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2