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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王宝龙 中级黑马   /  2012-9-19 13:33  /  1213 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王宝龙 于 2012-9-19 22:22 编辑

为什么我把定义的HashMap封装在类中(第一种)编译就失败呢?
而如果放在主函数下里面就可以呢?这是哪里有问题?
第一种:

  1. import java.util.*;

  2. class MyMap
  3. {
  4. HashMap<Integer,String> hm = new HashMap<Integer,String>();
  5. hm.put(1,"abcd");
  6. hm.put(2,"abc");
  7. hm.put(3,"def");
  8. hm.put(4,"ghi");
  9. hm.put(5,"jkl");
  10. hm.put(6,"mno");
  11. hm.put(7,"pqrs");
  12. hm.put(8,"tuv");
  13. hm.put(9,"wxyz");

  14. public HashMap<Integer,String> getHm()
  15. {
  16.   return hm;
  17. }
  18. }
  19. class Second
  20. {
  21. public static void main(String[] arge)
  22. {
  23.   
  24.   for(int i=1;i<10;i++)
  25.    sop(new MyMap.getHm().get(i));
  26. }
  27. public static void sop(Object obj)
  28. {
  29.   System.out.println(obj);
  30. }
  31. }
复制代码
第二种:
  1. import java.util.*;
  2. class Second
  3. {
  4.         public static void main(String[] arge)
  5.         {
  6.                 HashMap<Integer,String> hm = new HashMap<Integer,String>();
  7.                 hm.put(1,"abcd");
  8.                 hm.put(2,"abc");
  9.                 hm.put(3,"def");
  10.                 hm.put(4,"ghi");
  11.                 hm.put(5,"jkl");
  12.                 hm.put(6,"mno");
  13.                 hm.put(7,"pqrs");
  14.                 hm.put(8,"tuv");
  15.                 hm.put(9,"wxyz");
  16.                 for(int i=1;i<10;i++)
  17.                         sop(hm.get(i));
  18.         }
  19.         public static void sop(Object obj)
  20.         {
  21.                 System.out.println(obj);
  22.         }
  23. }
复制代码

3 个回复

倒序浏览
本帖最后由 李泽巍 于 2012-9-19 15:36 编辑

刚开始那个HashMap<Integer,String> hm = new HashMap<Integer,String>();在定义类的变量的时候就new我记得会报出个空指针异常,我的理解是:如果想要定义变量默认值,就必须给定一个准确的实质的一个值,而new方法返回的是一个null,此时并没有给new出来的这个HashMap赋值。(这是我个人理解,可能并不是很准确)我一般都先置空,如果需要初始化都重写一下构造函数
HashMap.put()是HashMap类的方法,构造一个类的时候在方法外面只能定义成员变量和构造函数,不能写入可以执行的代码,同样可以把那些put()放到构造函数里
在或者你可以把hm设为静态变量,写一个静态方法,把初始化hm的东西放到静态方法里
后面main函数里new MyMap.getHm().get(i)因为没有MyMap的实例无法调用MyMap里的方法,new只能对构造函数起作用,无法直接用new来调用类的方法的。所以请在使用类的方法之前先把类实例化
↓这是写进静态方法里,写进构造函数的就是把那个static静态方法里的东西移动到构造函数里
  1. import java.util.*;

  2. class MyMap
  3. {
  4. static HashMap<Integer,String> hm;

  5. static{
  6. hm = new HashMap<Integer,String>();
  7. hm.put(1,"abcd");
  8. hm.put(2,"abc");
  9. hm.put(3,"def");
  10. hm.put(4,"ghi");
  11. hm.put(5,"jkl");
  12. hm.put(6,"mno");
  13. hm.put(7,"pqrs");
  14. hm.put(8,"tuv");
  15. hm.put(9,"wxyz");
  16. }

  17. public HashMap<Integer,String> getHm()
  18. {
  19.   return hm;
  20. }
  21. }
  22. class Second
  23. {
  24. public static void main(String[] arge)
  25. {
  26.   MyMap mymap = new MyMap();
  27.   for(int i=1;i<10;i++)
  28.    sop(mymap.getHm().get(i));
  29. }
  30. public static void sop(Object obj)
  31. {
  32.   System.out.println(obj);
  33. }
  34. }
复制代码
回复 使用道具 举报
import java.util.*;



class MyMap

{

HashMap<Integer,String> hm = new HashMap<Integer,String>();

hm.put(1,"abcd");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(2,"abc");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(3,"def");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(4,"ghi");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(5,"jkl");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(6,"mno");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(7,"pqrs");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(8,"tuv");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行

hm.put(9,"wxyz");//语句必须放在函数体内,不能直接放在类里面。编译失败,创建对象时也不会自动执行



public HashMap<Integer,String> getHm()

{

return hm;

}

}

class Second

{

public static void main(String[] arge)

{



for(int i=1;i<10;i++)

  sop(new MyMap.getHm().get(i));//这样创建了十个对象
}

public static void sop(Object obj)

{
  System.out.println(obj);

}

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马