黑马程序员技术交流社区
标题:
方法中的内部类为什么不能访问方法中的局部变量?
[打印本页]
作者:
JustForYou
时间:
2015-10-31 16:12
标题:
方法中的内部类为什么不能访问方法中的局部变量?
求详解,上次听得迷迷糊糊的,好像要什么final?
作者:
wasxcwasxc
时间:
2015-10-31 16:14
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,内部类才会消亡,而方法的局部变量是存储在栈内存中的,当调用结束时就会弹栈,就是在内存中这个属性就消失了。
内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的局部变量,因此内部类不能直接访问方法中的局部变量。
解决方法:局部变量前加修饰符final,此时局部变量就会存在堆中,生命周期和内部类的生命周期是一样的,此时内部类就可以访问方法中的局部变量。
作者:
redsifei
时间:
2015-10-31 17:23
局部变量消失的快,局部内部类消失的慢,所以……,你可以反编译一下class文件,局部内部类如果调用了局部变量,反编译出来直接是调用常量的
作者:
Mr___dangerous
时间:
2015-10-31 18:55
简单来说,就是方法被调用后,就会被销毁,里面的变量也一起被干掉了,此时内部类可能还在继续使用,这时再调用变量就找不到了,会出错。你说的定义变量为final之后,变量就不会变了,内部类调用这个变量相当于调用一个常量,编译器在编译程序的时候,直接赋一个常量给内部类。
作者:
Pinfan
时间:
2015-10-31 19:28
我理解的是作用域的原因,内部类在局部位置上只能访问局部中被final修饰的局部变量,可以将内部类看做一个方法,该方法(即所说的内部类)去调用其它方法中的局部变量,因为局部变量的生命周期随着方法调用的结束而结束,如果内部类想要去调用另一个方法中的局部变量,必须要延长该变量的生命周期,即定义为final,常量
作者:
陈威
时间:
2015-10-31 21:09
A、局部内部类在静态方法中:只能调用静态的
B、局部内部类在成员方法中:既可以调用静态的也可以调用成员的
和所属的方法的特点一样
局部内部类调用局部变量时,局部变量必须被final修饰-----(记住)
作者:
Mona33
时间:
2015-10-31 23:04
成员内部类如果要访问成员变量,需要在变量前加final修饰,因为成员内部类是在垃圾回收器空闲时回收的,如果成员变量不加final修饰的话,在成员内部类还没有被垃圾回收器回收时,该成员变量就已经不存在了。
所以,为了不报错,就需要在成员变量前加final修饰。
PS:妹子第一次回答问题回答的这么全面,如果看懂了的话,能不能选我呢
作者:
北极的男娃
时间:
2015-11-1 09:48
方法中的内部类跟局部变量一样 会随着方法的调用而创建 消失而消失 但是创建的对象还在堆内存
假如方法中使用了局部变量
假如你这个内部类对象的地址值还赋给了一个生命周期更长的对象
当你调用完这个方法后 用周期更长的对象又一次使用了那个内部类对象 这是局部变量已经消失了 就会报错
而当你加了final后 这个常量会存储到方法区的常量池 生命周期跟外部类一样长 就不会报错了
这样说明白吗
作者:
zhangdazhi186
时间:
2015-11-1 13:21
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,内部类才会消亡。而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈,即在内存中这个属性就消失了。也就是说,内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。 解决方法就是在局部变量前加修饰符final ,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。
作者:
菊花爆满山
时间:
2015-11-1 14:48
说的太多反而不好理解 就记住 内部类的生命周期要长于方法中的变量 所以为了编译能通过 在变量前加一个final修饰 这样这个变量的生命周期就变成了 因为是常量了嘛 这样 他们的爱才能长久嘛 哈哈
作者:
LOVE毛豆豆
时间:
2015-11-1 16:09
你可以把成员变量作为参数传入到内部类中。然后用。你这相当于A类用B类的成员变量。怎么能用呢?创建他的对象可以
作者:
刘辰阳
时间:
2015-11-2 14:32
路过!!!!!!!!!
作者:
纯情永生
时间:
2015-11-2 21:41
1.局部内部类是在方法调用时进入堆中内存空间
2.局部变量是在方法调用时跟着方法进入栈中
3.可能堆中内部类还没有引用结束,而栈中的方法调用完毕而弹栈(此时局部变量也随之消失)
4.而之后如果内部类还要调用局部变量,但这个时候他已经不在了就不能调用...
5.但是如果用final修饰的局部变量就会以常量形式进入方法区中的常量池
6.这个常量池是与整个程序生命周期一致的,随时可以调用...
7.但是在JDK1.8版本之后就不需要final修饰了.....
8.求楼主赏赐黑马币
作者:
雷厉风行
时间:
2015-11-3 13:56
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
作者:
黑马,你的骄傲
时间:
2015-11-3 22:52
局部变量随着方法的调用完成就会消失,而类(.class文件)再次需要变量时会找不到,编译会报错,final修饰变量后,此变量会成为常量,不可改变,存储在方法区的常量池中,随用随调,不会消失
作者:
ok2784488
时间:
2015-11-5 08:46
wasxcwasxc 发表于 2015-10-31 16:14
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...
赞66666666
作者:
hnzklsx
时间:
2015-11-5 15:28
在方法中声明的内部类里面当然不能访问该方法的局部变量了,
他们就是各自单独的两个类,
你在一个类里面可以通过该类引用访问他的成员变量或者方法,
但是方法中内部声明的局部变量的作用域只是这个方法内部,
你无法访问这个局部变量,根本访问不了。
如果用final修饰的局部变量就可以继续使用了。
作者:
伍陶陶
时间:
2015-11-9 16:03
顶一下,虽然不是学java的。
作者:
萧未然
时间:
2015-11-10 17:55
自己实践了一下,通俗点,忘采纳哈
方法中的内部类不能访问该方法的局部变量是因为:
方法中声明内部类,目的只是由外部类来控制内部类的可见性,
将一个类放到一个方法当中去定义的时候,那么就限定了这个类的使用范围只能在方法的内部,
我们只是代码这样写而已,不要理解成为在这个方法内部有一个类,这个类是方法的一部分,
一调这方法类执行什么什么的.. 不是的,
我们只是代码这样写,目的是为了控制内部类的可见性,编译之后的结果,也会出现 外部类 和 内部类
各自的字节码class文件,这就说明内部类是一个独立的个体,他们就是两个类而已,他们各自都有自己
的成员变量和方法。
那么这个在方法中声明的内部类里面当然不能访问该方法的局部变量了,他们就是各自单独的两个类,
你在一个类里面可以通过该类引用访问他的成员变量或者方法,
但是方法中内部声明的局部变量的作用域只是这个方法内部,你无法访问这个局部变量,根本访问不了
作者:
liuqiang11164
时间:
2015-11-24 23:21
生命周期问题,final存在方法区了,生命周期变长了
作者:
小明啊
时间:
2016-1-17 00:02
wasxcwasxc 发表于 2015-10-31 16:14
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用 ...
楼上正解
作者:
陈梦佳
时间:
2016-2-8 21:12
class Outer{ // 定义外部类
private String info = "hello world" ; // 定义外部类的私有属性
public void fun(final int temp){ // 定义外部类的方法
class Inner{ // 在方法中定义的内部类
public void print(){ // 定义内部类的方法
System.out.println("类中的属性:" + info) ; // 直接访问外部类的私有属性
System.out.println("方法中的参数:" + temp) ;
}
};
new Inner().print() ; // 通过内部类的实例化对象调用方法
}
};
public class InnerClassDemo{
public static void main(String args[]){
new Outer().fun(30) ; // 调用外部类的方法
}
};
在方法中定义的的内部类不能直接访问方法中的的参数,如果方法中的参数要被内部类访问,则参数前必须加上final关键字。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2