import java.util.*;class Bean
{
int c = 0;
void set (int x) {
c=x;
}
int get() {
return c;
}
}public class Test
{
public static void main (String[] args) {
Bean cc = new Bean();
HashMap map = new HashMap();
cc.set(1);
map.put("a",cc);   //这里的“值”,为什么可以用cc(对象),cc中有值吗?
cc.set(2);
map.put("b",cc);
cc.set(3);
map.put("c",cc); System.out.println(((Bean)map.get("a")).get());//为什么要强制转换为Bean型,输出为什么是 3 ?
}
}
输出结果为: 3 //各位高手帮小弟解答一下上面的问题,谢谢啦!!

解决方案 »

  1.   

    lz,这里有一点很关键的是,Java的语义是 引用语义,并非C++的值语义。map.put("a",cc);       //这里的“值”,为什么可以用cc(对象),cc中有值吗?
    cc.set(2);
    map.put("b",cc);
    cc.set(3);
    map.put("c",cc);这三次存放到map中的都是同一个对象,也就是cc变量所引用的对象。
    而并不是存入了cc的copy。
      

  2.   

    public class Test {
      public static void main(String[] args) {
        Bean cc = new Bean();
        HashMap map = new HashMap();
        cc.set(1);
        map.put("a", cc); // 对象啊,什么值,Map的所谓的key-value 其实都必须是对象。
        cc.set(2);        // 你修改了 cc 对象的c值,
        map.put("b", cc); // 你把 cc 再次存到了 b 的key 里面,记得,cc 只有一个,只不过有2个信封都存了他的地址
        cc.set(3);        // 再次修改了cc的 c值
        map.put("c", cc); // 你又增加了一个信封,不过里面保存的依然是相同的地址    System.out.println(((Bean) map.get("a")).get());// Map 里面存的是对象,不是Bean, 所以拿出来时必须转换。 因为存的都是cc的地址,所以拿到的也只有cc了,所以cc的c值为最后一次赋值的 3
      }
    }如果你不希望强制转换,你可以这样声明
    HashMap<String,Bean> map = new HashMap<String,Bean>();不过需要JDK 5.0指出
      

  3.   

    map当中可以放object类型的,不管cc中有无值,cc中应该有值。map得到的是object类型的对象,object没有get()方法,所以要强制转换。因为三次put的对象均为cc是同一个对象,如果改成在cc.set(3)前加cc=new Bean()则输出应为2
      

  4.   

    首先你必须了解Map的所谓的key-value 其实都必须是对象.你的结果为什么是3,是因为后面你为对象赋的值覆盖了前面的值了,你提取的值总是最后一个赋的值,如果你想取的值不一样,就应该照下面的做.这样你就能取到a,b,c 的值了.import   java.util.*; class   Bean 

    int   c   =   0; 
    void   set   (int   x)   { 
    c=x; 

    int   get()   { 
    return   c; 

    } public   class   Test 

    public   static   void   main   (String[]   args)   { 
    Bean   cc ;HashMap   map   =   new   HashMap();
    cc=new Bean(); 
    cc.set(1); 
    map.put("a",cc);  
    cc=new Bean();
    cc.set(2); 
    map.put("b",cc); 
    cc=new Bean();
    cc.set(3); 
    map.put("c",cc); System.out.println(((Bean)map.get("a")).get());

      

  5.   

    取出的时候默认返回的是object,需要向下转型才能使用bean的方法
    c是引用,几次set都是修改的同一个对象,而添加到map里的都是同一个对象
      

  6.   

    放进去的只是引用,区别引用和引用指向的对象很重要。关于类型转换,向上或者向下,需要知道的一点是,这些是受编译器检查的。
    ((Bean)map.get("a")).get(); 编译期间只要转换后的类型中确实有被操作的方法,例如:Bean类中有get()方法。编译器是不会管你把芙蓉姐姐转成李嘉欣,还是把周杰伦转换成李宇春的。
    只有在运行时,JVM发现如果不能转换(例如:周杰伦转换成李宇春),才会抛出ClassCastException异常。另外,也可以考虑使用泛型机制。