0

有人可以解释类中如何使用接口的方法吗?

注意:我的疑问是“方法已经在 Class 中定义了,那么我们为什么要实现它?”

例如 :

interface printable{
void print();
}

class A implements printable{
public void print(){System.out.println("Hello");}

public static void main(String args[]){
A obj = new A();
obj.print();
 }
}

为什么 print() 在接口中声明?

4

6 回答 6

4

您通过提供其实现来定义方法。它们是同一个东西,所以你是对的,一旦你定义了一个方法,你就不需要实现它。

接口声明任何实现该接口的东西都将定义这些方法。这是接口合同的一部分。这允许您调用接口的任何方法,知道任何具体实现都将具有这样的方法。

顺便说一句,在 Java 8 中,它将支持虚拟扩展,这意味着接口可以提供默认实现。这必须根据接口提供的其他方法来定义。

于 2013-07-19T13:34:33.187 回答
3

接口定义了一组必须实现的方法。它没有说明它们是如何实施的。这就是类定义的用武之地,因为它定义了这些方法的实现方式。

因此,当您调用一个实现特定接口的类时,您肯定知道您会找到该接口定义的任何方法集。

当您需要向应用程序公开一些端点而不需要公开逻辑时,接口通常很方便。

编辑:根据您的示例,printable接口定义了实现它的类应该公开什么行为,在这种情况下print

这将允许您按照printable p = new A(); p.print();.

假设您有一些东西可以产生一个实现printable接口的对象,那么,调用该方法的人将不需要打扰该print方法的实际实现是什么。该接口确保您返回的任何内容都将包含该方法的实现。

于 2013-07-19T13:35:04.520 回答
3

接口是一个契约,所有实现它的类都应该定义接口中指定的方法。接口没有这样定义方法体。

于 2013-07-19T13:39:19.073 回答
3

@NarutoUzumaki 欢迎来到堆栈溢出!

我同意克里斯。您可以将 doSomething 方法替换为 eat() 方法以获得更好的理解。狗可能会吃与猫和长颈鹿不同的东西。

由你决定如何实现eat方法,在使用它时创建接口Animal的引用并将其指向你想使用的Dog、Cat或Giraffe的实例。这使您的类设计非常可扩展。

希望你现在有一个清晰的想法。

于 2013-07-19T13:49:55.033 回答
3

一般推荐基于接口的编程,原因如下

1)接口意味着规则,你应该在实现类中实现这些方法时遵循这些规则。

2)类之间的依赖关系较少,同时实例化您的实现类,然后从另一个类或某个地方调用您的方法。

3)您可以只发布您的接口细节,而无需向外界透露您的方法的实现细节。

于 2013-07-19T13:52:04.947 回答
2

定义接口的区别在于:

public void doSomething(Dog d)
{
   d.doSomething();
}

public void doSomething(Cat c)
{
   c.doSomething();
}

public void doSomething(Giraffe g)
{
   g.doSomething();
}

public void doSomething(Animal a)
{
   a.doSomething();
}

为什么?

好吧,如果所有类都只实现自己的方法,那么它们之间就没有共同的引用。但是,如果它们都从一个公共接口实现该方法,则它们可以被相同的引用类型引用;在这种情况下Animal

于 2013-07-19T13:42:56.057 回答