A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lzhuas 中级黑马   /  2014-4-14 12:40  /  1201 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

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

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

4 个回复

倒序浏览
你好像没有调用外部数据啊,你那个num是在类中自己定义的啊,如果你调用x的话,x前面就必须加上final了
回复 使用道具 举报
“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. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
内部类定义在局部的时候,可以直接访问外部类的成员,但是不能访问它所在的局部中的不加final的变量,而你的num是定义在内部类中的不是定义在外部类的局部变量上面的,所以不加final也可以访问的。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
class Outer{
        int x = 3;
        public void function(){
                AbsDemo d = new AbsDemo(){
                        int num = 9;//不是局部内部类只能访问被final修饰的局部变量吗?

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

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马