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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马东华 初级黑马   /  2012-4-23 16:58  /  2784 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类定义在类中的局部位置上,只能访问该局部被final修饰的局部变量,有谁能给我举个例子吗?

7 个回复

倒序浏览
本帖最后由 真真姐 于 2012-10-21 14:26 编辑

局部意思就是方法内部的意思
比如说你在Book类的方法write()的内部,定义了一个Reader类,那么这个类就是局部内部类!
你想访问所在方法的变量的话,当然需要用final,而且必须是在类的加载之前同时在类的初始化之前
给你举个例子把
public class Book {
public write ()
           {      
             final int  a =5; //去掉final就会报错的啊 ,同时把a的初始化放到InnerClass类的后面执行也出错,a必须优先加载                        
              
                 class Reader
                 {
                    private int b;
                    public Reader (int m)   
                        {
                           this.b = a;
                        }
                    public void show()
                        {
                           System.out.println(b);
                        }
                 }
             new InnerClass(b) .show();
          }
}

一目了然,关于内部类引用变量的问题!

回复 使用道具 举报
我勒个去,刚刚给徐晓磊解答,你就来问了。。。。
我自己写个例子你看下,验证局部内部类只能访问final类型的局部变量。
代码:
  1. package com.heima;

  2. public class LocalInnerClassTest {
  3.         //局部内部类要访问的x为final,去掉final你是编译通不过的。
  4.         public void defineInnerClass(int x) {
  5.                 //局部内部类
  6.                 class MyLocalInnerClass {
  7.                         public void doSomething() {
  8.                                 System.out.println("局部内部类MyLocalInnerClass打印的局部变量X为:"+x);
  9.                         }
  10.                 }
  11.                 new MyLocalInnerClass().doSomething();
  12.         }
  13.        
  14.         public static void main(String[] args) {
  15.                 LocalInnerClassTest lct = new LocalInnerClassTest();
  16.                 lct.defineInnerClass(5);
  17.         }
  18. }
复制代码
输出结果:

如果将final去掉编译是错误的。
图为:


int x 是局部变量,因为java底层的机制不能存取本地变量,这样导致内部类,没有办法取过来,所以java用了一个小聪明,直接把本地变量的refrenece拷贝到内部类。
因为这个小聪明,一般容易让人误解。所以他在编译器里面,加上了一个final,让你不要改变这个值,你只读不能存,这样感觉就好了。
哥又给你复制粘贴一遍。。。。累死了。。{:soso_e144:}
回复 使用道具 举报
不能偷懒,不同兄弟的意思不一样,要针对的进行解答,我的就是重新修改,根据他的意思解答的
回复 使用道具 举报
final是最终的意思,被它修饰的类不能被继承,被修饰的变量的值不能再改变!被它修饰的方法不能被重写!别final修饰的都不能再改变了!
比如匿名内部内只能访问final修饰的局部变量!
回复 使用道具 举报
final是最终的意思,被它修饰的类不能被继承,被修饰的变量的值不能再改变!被它修饰的方法不能被重写!别final修饰的都不能再改变了!
比如匿名内部内只能访问final修饰的局部变量!

大神发怒了,哈哈哈{:soso_e120:}{:soso_e120:}
回复 使用道具 举报
王勃 中级黑马 2012-4-23 17:37:48
7#
不能偷懒,不同兄弟的意思不一样,要针对的进行解答,我的就是重新修改,根据他的意思解答的

我在吃饭,看问题差不多一样,就粘贴喽,。。。。。{:soso_e117:}
回复 使用道具 举报
王勃 中级黑马 2012-4-23 18:00:13
8#
本帖最后由 王明(1988) 于 2012-4-23 18:18 编辑

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