private void launchFrame() {
this.setLocation(400, 300);
this.setSize(400, 300);
this.add(tf, BorderLayout.SOUTH);
this.add(taContent, BorderLayout.NORTH);
this.pack();
this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {
disconnect();
System.exit(0);
} });---------------------------------------------------------------------------
大家帮我看看,这是一段关闭窗口的代码,在窗口上注册addWindowListener的时候定义了一个适配器类型的内部类,这个类应该是抽象类啊,怎么可以直接new啊?另外怎么可以直在new他的同时还在方法体内重写void windowClosing方法?不太明白,麻烦大家给详细解释一下,先谢谢大家了

解决方案 »

  1.   

    你都已经给出了具体方法的定义了,可以这样理解,这里new 的是一个实现了某某接口的无名的类。
      

  2.   

    这里有一个我对匿名内部类的分析,可以看看 :
    http://topic.csdn.net/u/20080728/20/d60f719a-c103-44b8-8d0c-bc1c818b768a.html
      

  3.   

    这个是典型的匿名类的写法啊
    就像 下面的线程一样啊。new Thread(new Runnable(){
      public void run(){
        System.out.println("run...");
      }
    });
      

  4.   

    这是典型的匿名类用法啊,请看下面
    new WindowAdapter() { //new WindowAdapter说明创建一个匿名内部类,它继承自WindowAdapter类,如果new 后面是
    //一个接口,说明这是一个实现该接口的内部类public void windowClosing(WindowEvent e) { //既然是类那里面当然可以有自己的方法了,当然也可以重写父类的方法
    disconnect(); 
    System.exit(0); 
    } }
      

  5.   

    如果new 后面是
    //一个接口,说明这是一个实现该接口的内部类windowAdapter不是接口啊
      

  6.   

    windowAdapter 是一个abstract类啊,它不能生成实例啊,那怎么new它呢?
    内部匿名类new 后面到底是什么类型?new出来的又是什么?
      

  7.   

    接口或抽象类,或者具体的类都无所谓
    花括号里的内容是对这个抽象类的继承和实现。
    我的这个帖子里有说明
    http://topic.csdn.net/u/20080728/20/d60f719a-c103-44b8-8d0c-bc1c818b768a.html
      

  8.   

    this.addWindowListener(
    new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    disconnect();
    System.exit(0);
    }
    }
    );这是创建一个继承自类 WindowAdapter 的子类(匿名局部内部类)同时覆盖 WindowAdapter 的 windowClosing 方法,并同时创建这个匿名类的一个实例(现在不创建以后就没机会了,因为这个类没名儿)。
      

  9.   

    这匿名内部类相当于就是说创建了一个继承自某匿名类的对象。比如这里的new WindowAdapter() { }就是创建了个继承自WindowAdapter的对象。
      

  10.   

    那是个匿名类之类,继承了WindowAdapter类(抽象类),一般我们定义的类都是有名字的如 public class A extends Thread{},这个类的名字是A,它继承了Thread类,在{}中可以写一些方法,包括自定义的也包括重写父类。new WindowAdapter() {...... } 这样的写法意思是有一个类,继承了WindowAdapter,因为这个类只用一次,因此不想给它起名字,所以就用这种匿名类之类的写法。当此匿名类之类也需要定义一些新的方法,或者重写父类的方法(实例化匿名类之类),就要在后面跟的大括号中完成。
      

  11.   

    一个适配器类型的内部类,这个类应该是抽象类啊,怎么可以直接new啊?因为new 里面马上实现了抽象类没有实现的方法哦。如前面人所说,这个是匿名内部类。
      

  12.   

    也就是说,new后面是一个父类或者是一个接口,new出来的是这个父类或者实现了接口的子类?
    这样理解对吗?
      

  13.   

    haoxin
    好像是可以这么理解的
      

  14.   

    简单的理解,new WindowAdapter()就是创建一个实例
    花括号里面是这个类(WindowAdapter)的复用(实现).
    只是这个类没有名字.
    如果你不想这样做,你也可以给它起个名字.class ClassName implements WindouAdapter
    {
    public void windowClosing(WindowEvent e)
     {
    disconnect();
    System.exit(0);

    }
    this.addWindowListener(new ClassName());这样的效果是一样的.
      

  15.   

    有点问题.应试是extends而不是implementsclass ClassName extends WindouAdapter
    {
    public void windowClosing(WindowEvent e)
    {
    disconnect();
    System.exit(0);
    }
    }
    this.addWindowListener(new ClassName());