黑马程序员技术交流社区

标题: 三个问题 [打印本页]

作者: 禾呈    时间: 2013-7-13 15:36
标题: 三个问题
本帖最后由 杨兴庭 于 2013-7-14 11:06 编辑

方法中的 内部类,只可以访问方法中被final修饰的局部变量,不可以访问方法中普通 局部变量。为什么?


一个内部类,如果要实现单例设计模式,那么这个内部类中就要有静态方法,那么这个内部类就要是静态内部类,那么外部类定义的众多对象,都绑定的是一个内部类对象。
但是我们要实现,一个外部类对象绑定一个内部类对象,那么如何实现这个设计?


在map体系的集合中,它们的键采用的相应数据结构的存储模式,那么它们的值有相应的存储模式没?



作者: 王靖远    时间: 2013-7-13 16:11
方法中的普通局部变量在方法运行完就释放了,方法中的内部类声明周期比普通局部变量要长,如果可以调用普通局部变量,就可能出现调用到已经不存在的变量。

23不太清楚
作者: 木、易m    时间: 2013-7-13 16:23
第一题
因为内部类跟局部变量的生命周期不一样,内部类是存在堆中的,
而方法的局部变量是存储在栈中的,当调用结束时这个属性就消失了。
也就是说内部类的生命周期比局部变量长,有可能当局部变量消失内部类还没有消失,这样的话就会出错了。
但通过final声明局部变量后局部变量就会存放在堆里,这样跟局部变量的生命周期就一样了,这样就可以访问了。
作者: 草貌路飞    时间: 2013-7-13 17:45
二:自我理解.首先,我觉得不是把一个内部类定义成静态的它就变成外部类的一个共有对象了。它只是具备了static修饰符所具备的特点,比如访问静态成员,可以被外部直接访问等。但是它并不是一个变量。你想让外部类的每个对象对应一个内部类对象,可以定义一个变量,让外部类对象创建后对其分别初始化。当然,内部类不能是单例模式。
  1. public class Test6
  2. {
  3.         Demo demo;
  4.         static class Demo
  5.         {
  6.                 public static void show()
  7.                 {
  8.                         System.out.println("inner show");
  9.                 }
  10.         }
  11.         public static void main(String[] args)
  12.         {
  13.                 Test6 t1 = new Test6();
  14.                 t1.demo = new Demo();
  15.                 Test6 t2 = new Test6();
  16.                 t2.demo = new Demo();
  17.                 System.out.println(t1.demo == t2.demo);
  18.         }
  19. }
  20. //结果为false
复制代码

作者: 草貌路飞    时间: 2013-7-13 18:14
三:网上找了下,太深奥了不怎么理解..自己理解:要知道map中存储的是Entry对象数组,键和值都是存放在这个对象中的。而就hashtable和hashmap而言,entry对象的存储顺序是根据entry对象中的key的hashcode得来的。具体如何得来就看不懂了,而treemap是根据比较key得来的顺序。所以值应该是没有什么存储模式的。
作者: 禾呈    时间: 2013-7-13 18:18
草貌路飞 发表于 2013-7-13 18:14
三:网上找了下,太深奥了不怎么理解..自己理解:要知道map中存储的是Entry对象数组,键和值都是存放在这个 ...

那么是不是就表示,k值中存储着v值的引用,v值的存储是随意存的。
作者: 草貌路飞    时间: 2013-7-13 19:22
禾呈 发表于 2013-7-13 18:18
那么是不是就表示,k值中存储着v值的引用,v值的存储是随意存的。

不是这样的。你自己看一下吧,我也不怎么理解。反正结构就是数组加链表,数组就是Entry类型的数组,而数组的index是根据key对象的hashcode计算得来的。越想越乱
http://wenku.baidu.com/view/53276e6a011ca300a6c39012.html
作者: 花心々小土豆    时间: 2013-7-13 19:35
禾呈 发表于 2013-7-13 18:18
那么是不是就表示,k值中存储着v值的引用,v值的存储是随意存的。

可以这么想,map集合中每个元素就有两个属性:k和v,我们只要知道了K就肯定能拿到对应K的V。V里可以是具体的值也可以是引用。
比如V里存放的是一些基本的数据类型,他存放的就是数据本身;
数组有多维的,楼主有没有想过集合多维是什么样子?      <k,<k.v>>这时候原本v的地方应该是指向里层集合的引用!!!我自己想的不知道对不对、、、、
作者: 张云杰    时间: 2013-7-13 20:20
第一题 老毕说只能是被final修饰后的常量才行.. 还说了 这是一个规则,  内部类访问局部变量,局部变量需被申明最终类型, 因为这样可以使变量全局化,就相当于是在外部定义的而不是在方法里定义的
第二题, 为什么不想着在接口里定义一个方法, 然后方法里有内部类.. 这样每次实现接口, 就相当于你绑定了一个内部类对象
第三题, Map里的存储模式就是键值对形式.. 你可以想成 存储一个map 的key在栈区里, 然后这个key 映射的值被存在了堆区里.. 当然 我这个理解有可能不对.. 但你要是能这样理解.. 疑惑 应该是没了
作者: wll_sx1990    时间: 2013-7-13 22:45
第一个问题:类的生命周期比方法的生命周期,方法执行完了以后就弹栈了,生命周期结束了,而类中如果有方法中的变量就会出错。




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