黑马程序员技术交流社区

标题: 匿名内部类的覆盖问题 [打印本页]

作者: 林其荣    时间: 2013-1-22 21:22
标题: 匿名内部类的覆盖问题
本帖最后由 张向辉 于 2013-1-23 10:25 编辑

如果定义一个匿名内部类就需要覆盖抽象类或者实现接口的全部方法可是我发现
我在定义一个监听事件MouseAdapter的时候我只覆盖了一个方法也可以并不用覆盖其抽象类的全部方法 谁能解释下为什么定义这个MouseAdapter的时候只覆盖
一个方法也可以而不是覆盖全部方法呢
例如我定义了个匿名内部类这个就需要覆盖全部方法才可以
  fz f=new fz();
  f.demo(new z(){
   public int show(){
    return 5;
   }
   public int show1(){
    return 4;
   }
  
  }.show());
}
}
abstract class z{
abstract int show();
abstract int show1();
}
class fz{
public void demo(int a){
  System.out.println(a);
}
}
以上这个需要全部覆盖才可以.
Eventdome1(){
  frameshow();
}
public void frameshow(){
  frame =new Frame("窗口");
  frame.setBounds(300, 250, 600, 500);
  frame.setLayout(new FlowLayout());
  text=new TextField(15);
  but=new Button(" 按 钮  ");
  frame.add(text);
  frame.add(but);
  frame.setVisible(true);
  Evertshow();
}
public void Evertshow(){

  //按钮双击关闭动作
  but.addMouseListener(new MouseAdapter(){//为什么这个匿名内部类只覆盖一个方法也可以?
   
   public void mouseClicked(MouseEvent e)
  {  
   if(e.getClickCount()==2 ){
   System.exit(0);
   System.out.println("双击关闭");
   }
  
   }
   
  }
);
而这个为什么覆盖一个也可以呢?


作者: 黄锦成    时间: 2013-1-22 21:28
虽说MouseAdapter是抽象类,但是它里面的方法都是已经实现了的。没有抽象方法。所以覆写自己想要的方法就行了
作者: 杨玲    时间: 2013-1-22 22:41
MouseAdapter确实是个抽象类,但是所谓的要覆盖抽象类中的方法指的其实是它内部的抽象方法呀,而它内部没有抽象方法呀,你就算一个都不覆盖也能编译通过!它其实就是把鼠标事件接口中的抽象方法都用一个没有函数体的方法覆盖了,这样我们要处理鼠标事件的时候只用去覆盖其中我们需要处理的方法就行了,简化书写




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2