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

时间:2010-11-11 01:32:30

标签: java oop class interface methods

如何在不抽象的界面中创建方法?我知道它可以完成,我只是不知道如何。

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

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

8 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:7)

如果您对匿名内部课程感兴趣,他们的工作方式如下所示。

我们将继续使用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);
}

在您的应用中的某个位置,您可能想要响应鼠标事件,因此使用匿名内部类可以执行此类操作。

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...*/}
});

您在此处所做的是创建一个新类(没有名称,因此是匿名的) 实现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...*/}
}

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

看到区别?

我希望这会有所帮助。祝你好运。

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

答案 2 :(得分:1)

不,它不能在Java 6或7中完成。它将以循环方式成为project lambda的一部分,它将被定义为Java 8.建议的机制被称为扩展方法。

答案 3 :(得分:1)

在Java中你不能。也许您正在考虑的是一个抽象类。

  

Java中的抽象类可以实现接口并定义一些方法签名,同时使用“abstract”关键字保留其他方法 - Wikipedia

因此,就像在常规类中一样,您可以为一些具体方法提供实现。而且,就像在界面中一样,您可以声明抽象方法的签名。这些方法将由扩展抽象方法的具体类实现。像接口一样,抽象类无法实例化。

主要的实际区别在于,通过对抽象类进行子类化来创建具体类。因此,一个具体的类只能扩展一个抽象类,同时它可以实现许多接口。

答案 4 :(得分:1)

您将“界面中的非抽象方法”与“实现接口的类”混淆。你的问题:

  

addMouseListener(Object)方法怎么可能?

这是可能的,因为您传递给addMouseListener(MouseListener)的对象(它不接受Object,btw,而是MouseListener接口的实例)是实现该接口的类的实例:

public MyMouseListener implements MouseListener { ... }
addMouseListener(new MyMouseListener());

我建议您阅读有关Java(或OO)基础知识的教程,例如Java Tutorial的this section

答案 5 :(得分:1)

在Java中,默认情况下接口方法是公共的和抽象的。

例如:

public interface IPrint{
    public abstract void print();
}

这与:

相同
public interface IPrint{
    void print();
}

所以第一种选择是不好的做法。重点是你不能在界面内使用非抽象方法,因为它们默认是抽象的。但在抽象类中,您可以使用非抽象或抽象方法。

答案 6 :(得分:1)

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

public interface MyIntface {

    void abstract_method(int a, String b);

    default void nonabstract_method(){
        System.out.println("do something");
    }
}

答案 7 :(得分:0)

使用Java 8,您可以对接口内的方法进行默认实现,请访问此链接。 http://www.lambdafaq.org/what-are-default-methods/