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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

再看毕老师的教学视频时,毕老师讲内部类定义在局部位置上时,说只能访问被fianal修饰的局部变量,但我把final拿掉后,编译运行都没有错误,而且也有结果,这是为什么呢?

17 个回复

倒序浏览
滔哥 黑马帝 2014-12-26 18:53:33
沙发
检查一下,是否有错误
回复 使用道具 举报
我感觉你的不太可能,我特地按照你说的写了个类,在局部位置的内部类访问局部变量,该局部变量必须是声明为final的。你看看你的内部类是不是在局部的,或者是不是局部变量。这是我写的代码:
public class B {

    public static void main(String[] args) {
        B b = new B();
        b.method(5);// 创建对象并调用方法method
    }

    public void method(final int i) {// 定义局部变量
        // 在方法内定义内部类,是局部的
        class D {
            public String name;

            // 定义类的方法,该方法内访问局部变量
            public void method2() {
                System.out.println(i);// 访问局部变量,必须把i声明为final 否则编译不通过
            }
        }

        new D().method2();// 创建内部类的对象并调用其方法
    }
   
}
回复 使用道具 举报
过来看一下,积累一下经验
回复 使用道具 举报
你把代码写出来看看嘛
回复 使用道具 举报
JDK版本为1.8的话,会自动加上final的,有可能是你JDK版本的问题。

评分

参与人数 1黑马币 +2 收起 理由
杨佳名 + 2

查看全部评分

回复 使用道具 举报 1 0
java 1.8之后回默认加上final。
回复 使用道具 举报
内部类的成员变量必须被final修饰。。但是1.8之后,不加也可以,因为默认给你加上了。
回复 使用道具 举报
滔哥 发表于 2014-12-26 18:53
检查一下,是否有错误

没有错误啊,看完老师的视频立马就运行了一下,发现竟然可以
回复 使用道具 举报
duluhua 发表于 2014-12-26 19:26
我感觉你的不太可能,我特地按照你说的写了个类,在局部位置的内部类访问局部变量,该局部变量必须是声明为 ...

那你编译运行过没,我用的是内部类访问局部变量啊
回复 使用道具 举报
钟道上 发表于 2014-12-26 20:58
你把代码写出来看看嘛

好吧,我还是先再测试下吧,如果编译还可以通过就把我的问题写出来
回复 使用道具 举报
叫我小强 发表于 2014-12-26 21:02
JDK版本为1.8的话,会自动加上final的,有可能是你JDK版本的问题。

哦,难道是软件版本问题,我用的就是jdk1.8的
回复 使用道具 举报
82387737 发表于 2014-12-26 21:23
内部类的成员变量必须被final修饰。。但是1.8之后,不加也可以,因为默认给你加上了。 ...

哦,原来是这样啊,现在才知道
回复 使用道具 举报
82387737 发表于 2014-12-26 21:22
java 1.8之后回默认加上final。

哦,原来是这样的,课本上说明了吗
回复 使用道具 举报
看了楼上的评论,我觉得还有一种可能。楼主检查一下是否访问了成员了变量,如果你在成员变量定义了一次,内部类是能直接访问外部成员变量,,在局部只能算是再赋值了。这样加不加final都是可以的
回复 使用道具 举报
最好把你的代码贴上来,这样的分析才有意义啊
回复 使用道具 举报
FINE 中级黑马 2014-12-28 22:26:26
17#
你的代码在哪里??贴出来!
回复 使用道具 举报
不可能,因为生命周期不一样.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马