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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 木森森 中级黑马   /  2015-3-14 22:08  /  2343 人查看  /  27 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Test26
  2. {
  3.         public void show()
  4.         {
  5.                 int x=8;
  6.                 class T
  7.                 {
  8.                         public void fun()
  9.                         {
  10.                                 System.out.println(x);
  11.                         }
  12.                 }
  13.                 new T().fun();
  14.         }
  15.         public static void main(String[]args)
  16.         {
  17.                 new Test26().show();
  18.         }
  19. }
复制代码
不是说内部类只能访问所在方法的被final修饰的局部变量么,这个代码为什么还能运行呢

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

27 个回复

倒序浏览
class Test26
{
                private int x=8;//x定义在内部类外面
        public void show()
        {
                //int x=8;//从内部类中访问本地变量X;需要被声明为最终类型
                class T
                {
                        public void fun()
                        {
                                System.out.println(x);
                        }
                }
                new T().fun();
        }
        public static void main(String[]args)
        {
                new Test26().show();
        }
}
回复 使用道具 举报
本帖最后由 ㏒假™面具 于 2015-3-15 01:22 编辑

不能运行吧? 运行是报错的!是error,不是exception
回复 使用道具 举报
㏒假™面具 发表于 2015-3-15 01:05
不能运行吧? 运行是报错的!是error,不是exception

C:\Users\Administrator\Desktop\捕获
回复 使用道具 举报

运行没有问题的,可惜不能发截图,你不能运行么
回复 使用道具 举报
  1. package com.itheima;

  2. /**
  3. * @author Administrator
  4. *
  5. *6、 分析运行结果,说明原理。(没有分析结果不得分)

  6.         class A {
  7.             void fun1() {
  8.                       System.out.println(fun2());
  9.                 }
  10.                 int fun2() {
  11.                         return 123;
  12.                 }
  13.         }
  14.          public class B extends A {
  15.                 int fun2() {
  16.                          return 456;
  17.                  }
  18.               public static void main(String args[]) {
  19.                         B b = new B();
  20.                         b.fun1();
  21.                         A a = b;
  22.                         a.fun1();
  23.                 }
  24.         }
  25. *
  26. */
  27. public class Test6 {
  28.            public static void main(String[] args) {
  29.                 System.out.println("上面的到结果为:b.fun1=456 ,因为B重写了fun2方法");
  30.                 System.out.println("上面的到结果为:a.fun1=456 ,因为B重写了fun2方法 ,然后又B类的对象赋值给A类的对象,所以a对象也重写了fun2方法");
  31.                         System.out.println("类B继承A类,然后B类又重写了fun2方法");
  32.                 }
  33. }
复制代码
回复 使用道具 举报

您这是啥意思啊,不是回答我的问题的吧
回复 使用道具 举报
wenke 中级黑马 2015-3-15 09:55:57
8#
刚又回去看了看视频 这个地方当时还真没自己敲代码试过   按你的代码试了的确能运行 。 估计网上下的那个视频基于6.0 现在已经升级到java8 了   可能有些地方改了吗   
回复 使用道具 举报
wenke 中级黑马 2015-3-15 09:59:37
9#
好像内部类访问方法内的参数变量  参数变量也必须是final   但刚才试了试 不加final 同样能够运行
回复 使用道具 举报
本帖最后由 Jaybor 于 2015-3-15 10:16 编辑

内部类调用方法里的变量过程其实是将该变量拷贝一份到内部类里,这样即使方法里的变量死掉了那么也不会影响到内部类对象的使用;
如果变量是final的,那么拷贝品和原变量的变化就是同步的;反之,就会造成一种现象:明明内部类修改了方法里的变量,但是其值却根本没变;
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:16:39
11#
System.out.println(x-1); 这里打印的是x-1的值  并没有修改x的值呀
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:20:06
12#
刚才试了试  无论x加不加final   System。out.println(x++);  x++都报错   也就是x永远不能被修改
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:33:25
13#
好像意思是说如果局部内部类没有访问局部变量  那么局部变量就可以被修改  而一旦访问了局部变量 那么这个局部变量就不能再被修改 无论final与否

QQ截图20150315103218.png (14.36 KB, 下载次数: 9)

QQ截图20150315103218.png
回复 使用道具 举报
表示JDK1.7的版本显示会报错!其他JDK版本不知道!
回复 使用道具 举报
wenke 中级黑马 2015-3-15 10:37:04
15#
设置成1.7了   一样运行  并没有报错
回复 使用道具 举报
wenke 发表于 2015-3-15 10:20
刚才试了试  无论x加不加final   System。out.println(x++);  x++都报错   也就是x永远不能被修改 ...

是真的哎,x变成了x++就会报错,看来方法中的局部变量被方法中的内部类调用之后就会自动隐式地被final修饰,不能再改变了。

点评

JDK1.8隐式的添加了final的缘故  发表于 2015-3-20 11:06
回复 使用道具 举报 2 0

你 的局部内部类访问成员方法x so  你的x必须是final的才能编译通过
内部类定义在局部时不可以被成员修饰符修饰
不可以访问它所在的局部中的变量
只能访问被final修饰的局部变量
楼主 你确信你可以运行  请发截图
回复 使用道具 举报
夏鹏 发表于 2015-3-15 11:34
你 的局部内部类访问成员方法x so  你的x必须是final的才能编译通过
内部类定义在局部时不可以被成员修饰 ...

你不信就拿去运行一下嘛,回复不好发截图。千真万确。不止我一人没问题,你看看上面人的回复就知道了
回复 使用道具 举报
wenke 中级黑马 2015-3-16 14:33:42
19#
我这里通过jdk1.8 编译通过  没问题   并且恢复一个疑问大家试试   
char[] arrs={'I','l','o','v','e','y','o','u'};
System.out.println(arrs);
输出竟然是Iloveyou  并不是类似[Char@3d2a 之类的内存地址    各位试试  帮忙解答一下
回复 使用道具 举报
看来我还得去复习复习,一知半解的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马