黑马程序员技术交流社区

标题: 局部内部类的一个小问题 [打印本页]

作者: lzhuas    时间: 2014-4-14 12:40
标题: 局部内部类的一个小问题
public class InnerTest {
        public static void main(String[] args){
                new Outer().function();
        }
}

abstract class AbsDemo{
        abstract void show();
}

class Outer{
        int x = 3;
        public void function(){
                AbsDemo d = new AbsDemo(){
                        int num = 9;//不是局部内部类只能访问被final修饰的局部变量吗?
                        void show(){
                                System.out.println("num=="+num);
                        }
                };
                d.show();
        }
}


这是匿名内部类的一个例子,就是不大明白这程序为什么可以访问局部内部类的不是被final修饰的num

还有,请教大伙儿,这个代码你们是怎么复制上来的,截图的吗?

作者: 曹冬明    时间: 2014-4-14 13:00
你好像没有调用外部数据啊,你那个num是在类中自己定义的啊,如果你调用x的话,x前面就必须加上final了
作者: Shimano    时间: 2014-4-14 13:05
“int num = 9;//不是局部内部类只能访问被final修饰的局部变量吗?”


你以上这句话存在很大嫌疑,你定义的int num = 9;是匿名内部类中的成员变量,而不是局部变量!
毕老师所说的局部变量,应定义在function();方法下边,才是局部变量。代码如下:
  1. public class InnerTest {
  2.         public static void main(String[] args){
  3.                 new Outer().function();
  4.         }
  5. }

  6. abstract class AbsDemo{
  7.         abstract void show();
  8. }

  9. class Outer{
  10.         int x = 3;
  11.         public void function()
  12.                 {
  13.                         final int num = 8;//这这个num才是必须用final修饰的局部变量
  14.                AbsDemo d = new AbsDemo()
  15.                            {
  16.                    //int num = 9;这个num是匿名内部类的成员变量
  17.                    void show()
  18.                                    {
  19.                        System.out.println("num=="+num);
  20.                    }
  21.                                 };
  22.                 d.show();
  23.         }
  24. }
复制代码




作者: 你为谁归来    时间: 2014-4-14 13:12
内部类定义在局部的时候,可以直接访问外部类的成员,但是不能访问它所在的局部中的不加final的变量,而你的num是定义在内部类中的不是定义在外部类的局部变量上面的,所以不加final也可以访问的。
作者: ilvsoft    时间: 2014-4-14 13:19
class Outer{
        int x = 3;
        public void function(){
                AbsDemo d = new AbsDemo(){
                        int num = 9;//不是局部内部类只能访问被final修饰的局部变量吗?

你的num是匿名类内部定义的变量,所以可以直接使用,而如果num是function里面的参数或者成员变量的话则必须加上final,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2