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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wdtdcm 中级黑马   /  2014-2-27 10:44  /  862 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Outer{
  2.         int x=3;
  3.         /*
  4.         class Inner extends Abs{
  5.                 void show(){
  6.                         System.out.println(x);
  7.                 }
  8.         }
  9.         */

  10.         public void function(){
  11.                 //new Inner().show();
  12.                 //int x=9;//为什么定义这里时要加final修饰.
  13.                 new Abs(){
  14.                         int x=9;//为什么定义在这里可以呢?
  15.                         void show(){
  16.                                 System.out.println(x);
  17.                         }
  18.                 }.show();
  19.         }
  20. }

  21. abstract class Abs{
  22.         abstract void show();
  23. }

  24. class NiNei2{
  25.         public static void main(String[] args){
  26.                 new Outer().function();
  27.         }
  28. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

倒序浏览
不知道你的问题是不是注释的那部分。
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啊,只不过作用域不同

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报 0 1
本帖最后由 乔青山 于 2014-2-27 12:58 编辑

这个是生命周期的原因,有好多同学问过这个问题(其实你可以直接查阅一下):
定义在方法中时,运行这个方法会出现这种情况:
1.方法的局部内部类的一个对象在运行。
2.方法同时也在运行。
那这个时候是没问题的,但是:
当方法运行完毕后,方法中的局部变量会出栈,也就是说内存中没有这个变量了。
这个时候局部内部来还是在运行,而且还调用了方法中的变量,但是这个变量已经出栈了,所以就错误了。

而声明为final呢,这个局部变量会变为常量,存在于常量池中(你可以把他理解为方法中的静态属性)。
那这个局部变量就不会因为方法的结束而在内存中消失了,局部内部类才可以调用他。

评分

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

查看全部评分

回复 使用道具 举报
至于你说
int x=9;//为什么定义在这里可以呢?
这句就是定义在内部类中的变量,跟平时写的成员变量差不多。
换句话说,你写在内部类里就属于内部类了,不属于外部方法了(当然方法可以调用他)。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马