在Java中实现接口和覆盖方法?

时间:2011-04-13 10:38:22

标签: java interface implements

为什么必须覆盖接口的所有方法?

例如,如果我有

public class Foo extend JFrame implements ActionListener, KeyListener {
      foo(){
      }
    @Override
    public void keyPressed(KeyEvent arg) {          
    }

    @Override
    public void keyReleased(KeyEvent arg) {
}

    @Override
    public void keyTyped(KeyEvent arg) {        
    }
}

我将有很多我甚至不会使用的方法,有没有办法删除未使用的已实现方法,例如,如果我打算从界面使用一个方法

我也不想使用抽象,因为这意味着我无法创建对象的实例(至少我的编译器是这样说的)

6 个答案:

答案 0 :(得分:5)

具体类必须始终实现接口的所有方法。如果您尚未展开JFrame,则可以延长KeyAdapter。它为KeyListener实现了空方法,以避免将它们写出来。您可以在Foo类中使用匿名类,如下所示:

addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
        // handle typed key here
    }
});

答案 1 :(得分:4)

接口没有默认实现。如果您没有被迫在接口中实现每个方法,那么当其他一些代码试图通过接口调用这些方法时会发生什么?

答案 2 :(得分:2)

您可以创建具有这些空方法的Foo父类,并让Foo只实现您想要查看的方法。

实现接口时,必须在某处实现其所有方法才能创建具体对象。

答案 3 :(得分:2)

这正是KeyAdapter类的用途:它实现了接口的所有方法(但没有任何实现做任何事情)。由于你不能扩展两个类,你应该为你的监听器使用一个内部类(无论如何这是一个更干净的设计):

public class Foo extend JFrame {
      foo(){
          ...
          component.addKeyListener(new MyKeyListener());
          ...
      }

    private class MyKeyListener extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent arg) {          
        }
    }
}

答案 4 :(得分:2)

如果实现了接口,则意味着可以在需要实现的任何场景中使用已实现的对象。从这个角度来看很明显,你必须实现接口的所有方法,否则你不能说你已经实现了它。例如如果我有一个ICalculator接口与AddSubtract方法,并且您只想实现Add,那么结果类是否真的可以由另一个需要ICalculator?

但是,我非常了解你今天在框架中实现一些接口的愤怒,因为它们明显打破了Interface Segragation Principle。这意味着某些接口是几个功能的集合,可以一起使用来做一些有用的事情。例如。如果ICalculator接口,而不仅仅是基本AddDivide等方法,我开始添加StandardDeviation等方法,这些方法对于Calculator对象的性质不是必不可少的

底线,,您必须实现每个界面的成员,但是,如果您确定并且知道其中一些永远不会成为使用,随意留空,甚至更好,让他们抛出异常,所以你肯定永远真的意味着永远不会。

答案 5 :(得分:0)

你真的应该抓一本关于面向对象编程的好书并重温第一章。接口是方法的完全抽象定义,因此您无法部分实现接口。