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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐林渊 黑马帝   /  2012-3-10 22:00  /  1664 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

方法中的内部类能不能访问方法中的局部变量,为什么?

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

7 个回复

倒序浏览
因为内部类,可以等同的当成一个方法来看待
内部类可以直接访问成员变量,确不能直接访问局部变量

但是把局部变量 弄成 Final修饰 就可以用了,因此变为全局常量
回复 使用道具 举报
因为局部变量是临时的,方法一旦执行完毕即被释放,而内部类是要在java虚拟机中动态运行的程序,它的生命周期不随方法的结束而结束,故而。。。
如下:
class   A
{
int i = 3;
public   void   shout()
{

class   B
{
public   void   shout1()
{
System.out.println(i);
}

}
B   b=new   B();
b.shout1();
}

public   static   void   main(String   []   args)
{
A   a=new   A();
a.shout();
}
}
可正常输出3,证明可以访问类的变量i,但改为下面的方式:
class   A
{
public   void   shout(int temp)
{
final int i = temp;
class   B
{
public   void   shout1()
{
System.out.println(i);
}

}
B   b=new   B();
b.shout1();
}

public   static   void   main(String   []   args)
{
A   a=new   A();
a.shout(3);
}
}

如不是final变量, 当i发生变化, 类B实例不能找到新i变量的地址, 便会出现了歧义. 如不希望final, 可讲i定义为A的类成员变量

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 了无尘 于 2012-3-10 22:24 编辑

我这么给你说吧,这个涉及到原理问题,java在编译时会创建另外一个变量存储你访问的这个成员变量,之后在在内部类访问这个变量,如果你的外部类变量不是常量,你在外部类修改这个变量的值,内部类里的变量值是不会变的,所以为了避免这一现象,内部类访问外部成员必须是final的常量

关于这一点的协定是,内部类访问和外部类同时访问这个变量时,他们必须保持一致的结果。

另外涉及的一个问题是,final修饰的对象貌似在堆中,而方法的调用之类的却是在栈中,这也是避免方法结束之后,该变量被销毁,内部类无法访问。这个属于我自己的见解,不一定对。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
要考虑作用范围,局部变量只能在语句中或者方法中存在,语句或者方法执行完成之后,局部变量即消失了!
回复 使用道具 举报
被你彻底绕进去了,什么叫局部变量,类里面的除了成员变量,也就局部变量了,一般就是方法的参数吧
还有你的意思是问内部类访问外部类方法的局部变量(方法的参数),根本访问不到的,方法的作用就是用完局部变量,局部变量自己就消亡了。
另外内部类访问外部类的成员变量,在外部类中写一个方法实例化内部类,这样也就可以调用了。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
首先方法中定义有一个内部类,我们只是为了控制这个类的可见性,它并不是方法的一部分我们只是代码这样写,
目的是为了控制内部类的可见性,编译之后的结果,也会出现 外部类 和 内部类各自的字节码class文件,
这就说明内部类是一个独立的个体,他们就是两个类而已,他们各自都有自己的成员变量和方法。
并且方法的属性与内部类的生命周期不同. 方法执行完毕后,方法内的属性也会随之被销毁,然而如果让内部类在使用
被销毁的属性这并不合理. 解决方法就是加上final关键字.在java中, 某个属性一旦加上final关键字, 可以看作是常量,
而常量的生命周期在程序的整个执行期间
都是有效的. 所以可以引用, 不会出错.

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
djx900 黑马帝 2012-3-11 00:56:19
8#
老毕说 自己家有自己家玩  自己家没有出去网吧玩 没网吧不玩
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马