有人可以解释如何在类中使用接口的方法吗?
注意:我的疑问是“已经在类中定义了方法,那么为什么我们应该实现它?”
例如:
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()在接口??
中声明答案 0 :(得分:4)
通过提供实现来定义方法。它们是相同的,所以你是对的,一旦你定义了一个方法,你也不需要实现它。
接口声明实现此接口的任何内容都将定义这些方法。这是接口合同的一部分。这允许您调用接口的任何方法,而不是任何具体实现将具有这样的方法。
BTW在Java 8中,它将支持虚拟扩展,这意味着接口可以提供默认实现。这必须根据接口提供的其他方法进行定义。
答案 1 :(得分:3)
接口定义了一组必须实现的方法。它说没有如何实现它们。这是类定义的用武之地,因为它定义了这些方法的实现方式。
因此,当您调用实现特定接口的类时,您肯定知道您将找到接口定义的任何方法集。
当您需要向应用程序公开某些端点时,接口通常很方便,而无需公开逻辑。
编辑:根据您的示例,printable
接口定义了实现它的类应该暴露的行为,在本例中为print
。
这将允许您按照printable p = new A(); p.print();
。
假设你有一些东西产生一个实现printable
接口的对象,那么,无论谁调用该方法都不需要打扰print
方法的实际实现。界面确保无论您返回什么,都将包含该方法的实现。
答案 2 :(得分:3)
接口是一个契约,所有实现它的类都应该具有接口中指定的方法的定义。接口不会像这样定义方法体。
答案 3 :(得分:3)
@NarutoUzumaki 欢迎来到堆栈溢出!
我同意克里斯的观点。您可以使用eat()方法替换doSomething方法以更好地理解。狗可能会吃不同于猫和长颈鹿的东西。
由你决定如何实现eat方法,并在使用它时创建一个Animal接口的引用,并将它指向Dog,Cat或Giraffe的实例,它们会吃掉你想要使用的方法。这使您的类设计具有很强的可扩展性。
希望你现在明白一点。
答案 4 :(得分:3)
一般建议使用基于接口的编程,原因如下
1)接口意味着规则,你应该在Implemented类中实现这些方法时遵循这些规则。
2)类之间的依赖性较小,同时实现实现的类,然后从另一个类或其他类中调用您的方法。
3)您只需发布您的界面详细信息,无需向世界各地透露您的方法的实施细节。
答案 5 :(得分: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
。