如何在不抽象的界面中创建方法?我知道它可以完成,我只是不知道如何。
我举一个例子来说明我的困惑。在Java中,您可以实现java.awt.event.MouseListener,然后必须调用方法addMouseListener(Object)...将您的类作为参数传递,以便MouseListener知道要从中转换的对象。 addMouseListener(Object)方法怎么可能?
有人说我对匿名类使用非抽象方法的接口的方式感到困惑。如何在接口中实现匿名类,以便实现者可以调用其方法?我很新,在OOP仍然是'noob'。
答案 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/