代码如下:
  public void createMenuBar(){//创建菜单
      JMenuBar menuBar = new JMenuBar();
  String[] menuArr = {"文件","工具","帮助"};
  String[][] menuItemArr = { {"打开","-","退出"},
  {"放大","缩小","-","上一个","下一个"},
  {"帮助主题","关于"}
  };
      
  for(int i=0;i<menuArr.length;i++){
     JMenu menu = new JMenu(menuArr[i]);  for(int j=0;j<menuItemArr[i].length;j++){
     if(menuItemArr[i][j].equals("-")){
  menu.addSeparator();
 }
 else{
  JMenuItem menuItem = new JMenuItem(menuItemArr[i][j]);
  menu.add(menuItem);
 }
 }
 menuBar.add(menu);
  
  }       this.setJMenuBar(menuBar);
   
   }
这是一个创建菜单栏的方法。用for语句遍历数组创建菜单;
在这个方法中,下面一句话执行了三次;  JMenu menu = new JMenu(menuArr[i]);这句话则执行了10次;   JMenuItem menuItem = new JMenuItem(menuItemArr[i][j]);
我的疑问是:因为一共有 13 次 new  语句执行了。所以在堆空间会产生 3个 JMenu()对象和10个JMenuItem()对象。但是指向它们的引用貌似只有两个啊,3个JMenu()对象被 menu 引用,10个JMenuItem()被menuItem引用。难道一个引用可以指向多个对象??如果不是这样,那就有2个JMenu()和9个JMenuItem()对象没有引用,java的垃圾回收就会把它们销毁掉。上面的方法成功的创建了它所预想的菜单栏,请高手解释,小弟不胜感激!!

解决方案 »

  1.   

    一个引用只可以指向一个对象。Java中有匿名类
      

  2.   

    首先.执行了3次JMenu menu = new JMenu(menuArr[i]); 因为每次的参数不同,所以他们都会分配不同的内存空间的,,至于保存他们引用的menu,也只保存了一个实例的引用,,其他实例的引用在你 menuBar.add(menu);里面保存了,保存在了menuBar,中,,,,所以才能把menu添加到menuBar中,,,不然没有被保存引用的实例是会被垃圾回收器清理的!!下面那个也是一样
      

  3.   

     
    JMenu menu = null;
    for(int i=0;i<menuArr.length;i++){
             menu+"i" = new JMenu(menuArr[i]);
             JMenuItem menuItem = null;
             for(int j=0;j<menuItemArr[i].length;j++){
                 if(menuItemArr[i][j].equals("-")){
                  (menu+"i").addSeparator();
                 }
                 else{
                  menuItem+"j" = new JMenuItem(menuItemArr[i][j]);
                  (menu+"i").add(menuItem+"j");
                 }
             }
             menuBar.add(menu+"i");
          
          }这样是不是就不止3个引用了?
    menu是局部变量 每次循环都会分配一个不同的地址
    你仔细想想
      

  4.   

    外部引用肯定不止两个,还有引用在menuBar里呢
    menuBar.add(menu+"i");
      

  5.   

    再追问一下,垃圾回收为什么不清理匿名类??《thinking in java 》上面说,垃圾回收器不会清理 “活”的对象,怎么判断对象是“活”的啊?