黑马程序员技术交流社区

标题: 内部类访问问题。 [打印本页]

作者: 杨成    时间: 2013-4-8 16:24
标题: 内部类访问问题。
本帖最后由 杨成 于 2013-4-9 00:21 编辑

今天复习,看到毕老师曾经在视频中讲到:“局部内部类只能访问局部当中的final类型变量。 ”后来自己上网查了下资料,说法有很多,但自己看了后还不是很清楚,求解惑!
作者: liuyangyang    时间: 2013-4-8 17:02
你好,
这是我自己的理解:局部变量都是在栈内存中的,它生命周期是由这个方法生命周期而决定的,而在这个方法中类的生命周期和方法的生命周期不同。假如:当某一时刻方法运行结束了,这个局部变量也将结束(死亡),而类的生命还没结束,这时去调用局部变量是找不到的。

举个例子:
假如有一个电视机(代表方法),它“15” 这个频道是cctv-1(代表局布变量),用遥控器(代表内部类)按15时,电视都会出现“cctv-1”这个频道,有一天,电视被偷了(方法的生命结束),再去拿遥控器按15会出现“cctv-1”这个频道吗?  呵呵,可能不是很恰当,这只是我浅薄的理解。


作者: 郭彦君    时间: 2013-4-8 17:04
内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,是依附于外部类存在的。内部类可以为静态的,也可以用protected和private来修饰,而外部类只能用public和默认修饰符修饰。内部类分为成员内部类,局部内部类,静态内部类和匿名内部类。
使用内部类的好处:每个内部类都可以独立的继承其他类,和外部类是否已经继承其他类无关。内部类使得多重继承的解决方案变得完整,因为接口也提供多继承,两种方法结合会解决很多复杂问题。
1、成员内部类特点:不可以定义静态成员;可以访问外部类的所有成员。
2、局部内部类特点:不可以有访问修饰符;可以访问所在代码块儿的变量和外围类的成员。
3、静态内部类特点:也叫嵌套类。如果内部类对象不需要与外围类对象之间产生联系,就可以定义静态内部类。不能从嵌套类的对象访问非静态的外围类对象。
3、匿名内部类特点:当只需要用到类的一个实例,而且代码比较少的时候用匿名内部类。但是匿名内部类不能有构造方法,不能定义任何静态成员。
作者: 奋斗2013    时间: 2013-4-8 17:15
在类中定义的类称为内部类,内部类可以分为成员内部类,局部内部类,以及匿名内部类和静态内部类。
在内部类中可以随便使用外部类的成员方法以及成员变量,哪怕这些成员被修饰为private。实例如下;
public class OuterClass{
   private int numb=0;
   private void testMethod(){
}
private class InnerClass{
void test(){
testMethod();
number++;
}
}
}
静态内部类有些特殊,使用static关键字定义的内部类称为静态内部类。静态内部类的一个最大特点是不可以使用外部类的非静态成员。
静态内部类有以下两个特点:
1.如果创建静态内部类的对象不许要外部类对象的引用。
2.不能从静态能从静态内部类的也能用中访问非静态外部类的成员。

作者: 郭彦君    时间: 2013-4-8 22:48
涛哥太厚道了,直接给2分儿,爱死你了
作者: Keith    时间: 2013-4-8 22:55
我的理解:
方法内的局部变量是在栈中,栈中的东西用完就没,
new的内部类在堆中,只要有引用可以一直存在,
用final修饰的局部变量存在常量区,里面的值唯一,也是一直存在.
所以当内部类访问局部变量时,要把局部变量用final修饰,要不然生命周期不一样,调用出问题,找不到了咋办.......
作者: liuyangyang    时间: 2013-4-8 23:09
谢谢滔哥!
作者: 杨成    时间: 2013-4-8 23:45
本帖最后由 杨成 于 2013-4-9 00:46 编辑

都没回答到点上啊!我问的是:“为什么局部内部类只能访问局部当中的final类型变量? ”

还是我自己查资料总结下:
如果局部内部类访问一个非final类型的局部变量,等到这个内部类所在的方法结束后,这个变量应该被销毁。而这时内部类对象还可能一直存在(不再引用该内部类对象时才会被回收),内部类对象就引用了一个已经不存在的局部变量。就这就好比我先去买了个电脑,用着用着突然停电了。所以这个变量如果并final修饰的话,他就会存在于方法区的常量池中。这样的话,这个变量就不受这个内部类的函数的生命周期的限制了!

好不容易搞懂了,楼上的几位问题都没看清,都回答些内部类的概念,并没有回答到我想知道的内存管理机制,自己找资料明白了,滔哥这都给楼上几位每人2分,滔哥冲我这精神,再给我补1个技术分呗!
呵呵!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2