小弟初学Java以前学C++有半年。在java中这样一种写法:myPanel.add(new JButton(new ColorAction("Red",Color.RED))); 请问这个一个匿名的new 不会出问题吧
根据java GC规则是说当一个类不再被任何变量引用时,就被回收.
这种情况下,那些JButton和ColorAction都没有被任何变量引用啊? 会不会被GC回收呢?
还有我在java中发现在类的构造函数申明的对象在退出构造函数后,仍然可以被其它成员函数使用.

解决方案 »

  1.   

    两种写法有没有区别?
    myPanel.add(new JButton(new ColorAction("Red",Color.RED))); 和ColorAction ca = new ColorAction("Red",Color.RED);
    JButton btnRed =  new JButton(ca);
    myPanel.add(btnRed);
      

  2.   

    呵呵~这个问题很好理解。~虽然你只是new了一下并没有把它给任何一个reference。但是在new JButton()这个对象中必然存在一个它的引用。同理myPanel.add这句话也将你刚才new的BUTTON保存在了myPanel的一个引用里。第二楼的问题可以用指针解释一下~
    myPanel.add(new JButton(new ColorAction("Red",Color.RED))); 
    这种写法~在MyPanel中存在一个指针引用new Jbutton在new Jbutton中又有一个指针引用new colorAction。

    ColorAction ca = new ColorAction("Red",Color.RED);
    JButton btnRed =  new JButton(ca);
    myPanel.add(btnRed);
    首先创建了一个指针ca 引用了new colorAction
    然后
    JButton btnRed =  new JButton(ca);
    创建一个指针btnRed引用了new Jbutton 同时new Jbutton中又拥有一个指针引用new colorAction
    即new Jbutton中的指针和ca这个指针引用的是同一个对象,同一段内存。
    下面的myPanel.add(btnRed);
    同理
      

  3.   

    谢谢你的回答。
    你的意思是说,虽然new 没有给名字,不过编译器会给出一个匿名的引用 
    所以第一种写法仍然是安全的。
    不过这个匿名的引用是建立在stack 还是在 heap上呢? 不过我更喜欢第一种写法。不但因为简洁而是
    给变量取一个有意义的名字本来就是一件痛苦的事情.
      

  4.   

    编译期是不会建立引用的,都是在执行期建立~new对象时候先会做很多事~但是最后会为这个对象指定引用