import java.awt.*;
import java.awt.event.*;public class MyFrame {
    public static void main(String[] args) {
new Frame1();
    }
}
class Frame1 extends Frame {
    Frame1() {
class AASD extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
System.exit(0);
    }
}
addWindowListener(new AASD());
setSize( 350, 200 );
setVisible( true );
    }
}================================================================
问题1:
在MyFrame 的 main 中:new Frame1();
获取了一个对象。却没有任何引用。可是它不会被System.gc()回收啊!这又是为什么呢?------------
问题2:
D:\MyJava>javac MyFrame.java
MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
        addWindowListener(new AASD());
        ^
说不能在这里应用; AASD能做向上转型啊。为什么不对呢?
我为此专门做了测试却能正常运行,代码如下:
interface Contents { // can't use public modifer;
    int values();
}
abstract class CC {
    int v(){return 1;}
}
class DD {
    int e(){return 55;}
}public class Parcel6 {    public static Contents dest() {
return new Contents() {
    private int i = 4;
    public int values() {
return i;
    }
};
    }    class AASC extends CC {
int v() {return 3;}
    }    public CC dd() {
return new AASC();
    }    public DD ee() {
return new DD() {
    public int e() {
return 33;
    }
};
    }    public static void main(String[] args) {
System.out.println(Parcel6.dest().values());
Parcel6 p6 = new Parcel6();
System.out.println(p6.dd().v());
System.out.println(p6.ee().e());
    }
}
问题3:
帖子 http://community.csdn.net/Expert/topic/3977/3977241.xml?temp=.310589 中:
  方法wi.super();是如何实象"获取 期望继承某个内部类的外部类的 引用"

解决方案 »

  1.   

    1.System.gc()只是回收那些不被使用的内存,而new Frame1();正在被使用,故。
    2.WindowAdapter这是个接口还是abstract class 啊,查一下啊,好像看过要是继承的话,必须要实现所有方法。
    3.我去看看先
      

  2.   

    问题1:在这里new Frame1()是一个相当于全局作用域范围的实体(当然在面向对象的思想中没有全局变量这样的概念,这里只是为了理解方便),所以在整个程序结束之前,该对象不会消失。问题2:代码我已经测试通过,没有任何问题,在这里确实可以向上转型,不知道楼主为何会发生错误,至于这里没有使用WindowLintener interface而用了WindowAdapter class是使用了适配器模式,将不必要的接口隐藏起来问题3:你可以把他想象成一个神奇的标记,当编译器读到此地时就会先给outclass一个实例初始化,我想大凡只要知道在初始化inner class时,首先需要依托out class,但有时候没有必要知道为什么需要这样去实现,因为他就是约定俗成的一种规范方法,如果一定要问为什么的话就只有讨教JAVA架构师,在设计该功能时当时的想法了,呵呵@.@||~
      

  3.   

    to: superslash我记得Thinking in Java2 中 关于gc()是说 回收的是没有被引用的对象啊;
    不过你说的也有道理。假如该对象正在使用中。是释放不掉的。
    WindowAdapter 是一个 abstract class ;方法我都已经实象了。
    如果没有完全实象的话会有其他错误提示的呀。(并会指出未实象的方法)
      

  4.   

    to:midthinker(呵呵)您在问题1中回答的好象不对。我做了一个测试:================
    public class MyFrame {
        public static void main(String[] args) {
    new Frame1(0);
    System.gc();
    new Frame1(1);
    System.gc();
    new Frame1(2);
    System.gc();
        }
    }class Frame1 {
        int i=0;
        Frame1(int ii) {
    i = ii;
    System.out.println("Frame1("+i+");");
        }
        public void finalize() {
    System.out.println("finalized("+i+");");
        }
    }
    System.out: _____________________
    D:\MyJava>javac MyFrame.javaD:\MyJava>java  MyFrame
    Frame1(0);
    finalized(0);
    Frame1(1);
    finalized(1);
    Frame1(2);
    finalized(2);
    --------------------------------
    re 问题2
    我这里确实会出现上面的问题啊;就是提示出错:_____________
    D:\MyJava>javac MyFrame.java
    MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
            addWindowListener(new AASD());
            ^
    能告诉我您的编译环境么 ?  我就是jdk1.5的;
    --------------------------------
    re 问题3
    呵呵。。这是我学习的一种习惯;  我就是要弄懂这个 为什么。
    因为我认为:
        如果只是记住它。那您只能在您所接触过的环境下面使用您所记得的方法;
        也缺少了灵活应用它的思维;
        这个好比是 我们学生时代学习理科时接触到的那些“公式”(我认为公式也是教条)。
        我们一定要理解它的真正含义;方能做的“灵活运用”这四个字;
        好比说为什么三角形的 面积=底X高/2; 我都会给它一个也能让人家理解说法。我认为这是一个非常好的习惯!
      

  5.   

    上名代码改为下面的也许好理解一点!!!
    import java.awt.*;
    import java.awt.event.*;public class MyFrame {
        public static void main(String[] args) {
    Frame1 f=new Frame1();
        }
    }
    class Frame1 extends Frame {
        Frame1() {

    addWindowListener(new WindowAdapter(){public void  windowClosing(WindowEvent e){setVisible(false);System.exit(0);}});
    setSize( 350, 200 );
    setVisible( true );
                 }
        }
    }
      

  6.   

    to: luoxueyong(琪咪漫珥)谢谢您的建议;
    呵呵。。我就是故意改了一下。结果发现出错了。 现在找错在哪里
    0_-!!
      

  7.   

    to: luoxueyong
    问题1:首先您的第二个实验强行启动了垃圾处理回收机制,这并不是一个被提倡的方法。System.gc()会强迫执行垃圾回收器,终结动作便会发生于所有对象之上。这才是导致您的多个对象被回收的原因。问题2:恭喜楼主已经解决问题3:我和敬佩楼主对技术细节的把控与追求,但是引用前人的话说       在学习C++时,最重要的事情就是集中关注概念,不要迷失在语言的技术细节中。...为此,对于程序设计和设计技术的理解远比对细节的理解更重要,而这种理解的根本是时间和实践。
                                                            —— C++之父 Bjarne Stroustrup我仔仔细细的看完了第三个问题的帖子的每一个回复,并且查阅了相关资料,在这个问题上,wi.super()的调用似乎更像是为了解决某一特殊问题的实现方案,就比如Serialize interface只是被用来告诉JVM,实现该接口的对象可以被安全的串行化,以及Cloneable接口同样是用来表示一个对象可以被安全的克隆一样。
        我是一个JAVA初学者,也并不清楚楼主已经达到JAVA层次,但是如果您和我一样还是一个刚刚涉及语言设计细节的学者,给一个小小的建议,那就是请先将此问题做为一个约定俗成的规范加以调用,技术的细节在您确实需要了解他的内在时再去深究也不迟。@.@||~
      

  8.   

    to: midthinkerre 问题一:
      突然间我注意到了下面的两个函数:setSize( 350, 200 );setVisible( true );
      设想一下,假如new Frame1();了之后没有一个引用指向这个对象的话,那么上面的这两个函数将无法对这个new出来的实例做设定大小和是否可见的操作!(也就意味着一定有一个引用,指着它)
    re 问题二:
      其实我只是把一个无名类赋予了个名字(AASD)。却发现不能运行;但是在我的测试中。使用同样的方法对无名类赋予名字却是可行的。
      sorry.我还没有解决;我这里运行的时候就是提示错误。内容如下:
      D:\MyJava>javac MyFrame.java
      MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
            addWindowListener(new AASD());
            ^
    您那里能通过吗?能告诉我您使用的开发环境么?re 问题三:
      说来说去。就是我对super的疑惑;看下面的代码:
      说明一下,tij中前面的介绍super的我都清楚。
      用我前面所了解的super来对这个super做解释时发生的困难。
      我也是Java初学者。class Super{} //注意这里是大写的Sclass WithInner {
        class Inner extends Super {}
    }public class InheritInner extends WithInner.Inner {
        ....
        InheritInner(WithInner wi) {
            wi.super()
        }
        WithInner wi = new WithInner();
        InheritInner ii = new InheritInner(wi);
        ....
    }
    我认为这时:wi.super() 是调用类 Super 构造函数。
      这与结果(初始化那个神秘reference)不符;对于问题3。我打算暂时不去追究这个"为什么"。或许目前的知识面太窄,理解比较难。
      

  9.   

    到现在。。问题只有一个了。我重新写一下好了
    各位大哥们。知道的告诉我一声。如果觉得分少。可以提出来。几百分是给的起的。!
    我想这种问题应该不是很难啊。只是我的知识范围窄。眼光短,看不出问题出在哪里。其实我只是把一个无名类赋予了个名字(AASD)。却发现不能运行;但我新做了个测试。使用同样的方法对无名类赋予名字却是可行的。问题代码如下:==============================
    import java.awt.*;
    import java.awt.event.*;public class MyFrame {
        public static void main(String[] args) {
            new Frame1();
        }
    }
    class Frame1 extends Frame {
        Frame1() {
            //这样写是不行的。出错提示见下面:
            class AASD extends WindowAdapter {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            }
            addWindowListener(new AASD());
       /**这样写就没事了能告诉我为什么吗 ?各位大哥!
            addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        */
            setSize( 350, 200 );
            setVisible( true );
        }
    }错误提示如下:_____________________
      D:\MyJava>javac MyFrame.java
      MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
            addWindowListener(new AASD());
            ^
      

  10.   

    在MyFrame 的 main 中:new Frame1()创建后没有任何引用,java中没有引用的对象就被当作垃圾,如果运行System.gc()就会被回收.
      

  11.   

    to : gtlang78()你楼上的楼上的代码能执行么  ?真的么?我这里不行啊。
      

  12.   

    关于问题1我也想说点自己的想法。
    没有被回收,说明还有引用指向他。
    我想这里主要有嫌疑的地方就是 setVisbale 方法。我想这个方法执行的时候已经把这个frame的引用传递给了另外一个线程。另外那个线程持有这个引用。我们看到窗口你不关闭它是不会自己关闭的,可见存在另外一个线程。import java.awt.*;
    import java.awt.event.*;public class Hello {
        public static void main(String[] args) {
    new Frame1();
        }
    }
    class Frame1 extends Frame {
        Frame1() {
    class AASD extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
    System.exit(0);
        }
    }
    addWindowListener(new AASD());
    setSize( 350, 200 );
    setVisible( true );
    System.out.println("Ok");
        }
    }
    为了试验,构造函数中加入一句。当输出 Ok 的时候,可见setVisible函数已经运行完毕。
      

  13.   

    谢谢  faen(发恩) 提出的宝贵见解 !
    我只能说感觉的到你说的大概意思。呵呵。
    不过我认为您举的例子不能证明 已经有一个reference 指向 Frame1了。
    println("Ok");在完成构造之前就打印出来的。所以。无论如何 ok都会显示的。我自己的电脑编译时就出错了。
    ========================================
    D:\MyJava>cd tmpD:\MyJava\tmp>javac Hello.java
    Hello.java:16: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (AASD)
            addWindowListener(new AASD());
            ^
    1 errorD:\MyJava\tmp>
    公司里的就能通过编译。能正常执行。
    用的都是同一个操作系统版本 java的开发环境也是相同的呀。