你如何在界面中获得非抽象方法?

Ben*_*Ben 2 java oop methods interface class

如何在不抽象的接口中创建方法?我知道可以做到,我只是不知道如何做.

我举一个例子来说明我的困惑.在Java中,您可以实现java.awt.event.MouseListener,然后必须调用方法addMouseListener(Object)...将您的类作为参数传递,以便MouseListener知道要从中转换的对象.addMouseListener(Object)方法如何可能?

有人说我对匿名类使用非抽象方法的接口的方式感到困惑.如何在接口中实现匿名类,以便实现者可以调用其方法?我很新,在OOP仍然是'noob'.

mgv*_*mgv 16

接口方法根据定义是public和abstract,因此您不能在接口中使用非抽象方法.

  • 你不能.我认为你混淆了抽象类和接口. (4认同)

Tod*_*odd 8

如果您对匿名内部类感兴趣,它们的工作方式如下所示.

我们将继续使用MouseListener示例.

java.awt.event.MouseListener看起来像这样的界面:

public interface  MouseListener {
  void mouseClicked(MouseEvent e);
  void mouseEntered(MouseEvent e);
  void mouseExited(MouseEvent e);
  void mousePressed(MouseEvent e);
  void mouseReleased(MouseEvent e);
}
Run Code Online (Sandbox Code Playgroud)

在你的应用程序的某个地方你可能想要响应鼠标事件,所以使用匿名内部类你可以做这样的事情.

component.addMouseListener(new MouseListener() {
  public void mouseClicked(MouseEvent e){/*implementation goes here...*/}
  public void mouseEntered(MouseEvent e){/*implementation goes here...*/}
  public void mouseExited(MouseEvent e){/*implementation goes here...*/}
  public void mousePressed(MouseEvent e){/*implementation goes here...*/}
  public void mouseReleased(MouseEvent e){/*implementation goes here...*/}
});
Run Code Online (Sandbox Code Playgroud)

你在这里所做的是创建一个实现MouseListener接口的新类(没有名称,因此是匿名的).如上所述,您没有在接口上创建非抽象方法.

您也可以创建一个新的命名类("命名类"表示常规旧类):

class MyMouseListener implements MouseListener {
  public void mouseClicked(MouseEvent e){/*implementation goes here...*/}
  public void mouseEntered(MouseEvent e){/*implementation goes here...*/}
  public void mouseExited(MouseEvent e){/*implementation goes here...*/}
  public void mousePressed(MouseEvent e){/*implementation goes here...*/}
  public void mouseReleased(MouseEvent e){/*implementation goes here...*/}
}
Run Code Online (Sandbox Code Playgroud)

然后你会做的其他地方 component.addMouseListener(new MyMouseListener());

看到不同?

我希望这有帮助.祝好运.

PS - 阅读Java中的继承,接口,内部类和匿名内部类,以便更深入地理解.


小智 8

在 Java 8 之后,您可以使用“default”关键字作为休闲方式在接口内定义非抽象方法。

public interface MyIntface {

    void abstract_method(int a, String b);

    default void nonabstract_method(){
        System.out.println("do something");
    }
}
Run Code Online (Sandbox Code Playgroud)