代码1:
public class User1 implements MyInterface
{
@Override
public void doCalculation() { }
}
public class User2 implements MyInterface
{
@Override
public void doCalculation() { }
}
interface MyInterface
{
public void doCalculation();
}
代码2:
public class User1
{
public void doCalculation() { }
}
public class User2
{
public void doCalculation() { }
}
在我的代码1 中,我MyInterface
有一个空方法doCalculation()
。
user1和user2通过实施doCalculation()
使用MyInterface
。
在我的代码2 中,我有两个不同的类,定义了doCalculation()
方法。
在code1和code2两种情况下,我自己都要编写实现。我的方法doCalculation()
只是一个空方法。
那么MyInterface
在这里的用途是什么?
它只提供方法名称或骨架(这是界面的唯一优势)?
否则我会在使用MyInterface
时保存内存吗?
是吗,它只为实现它的类提供了空方法,那么为什么不像我在code2中那样自己定义它。
使用界面还有更多优势。
答案 0 :(得分:3)
接口被大量使用,因为它们基本上是您的课程应该能够做的蓝图。
例如,如果您正在编写带有字符的视频游戏,则可以使用一个界面来保存角色应具有的所有方法。
例如
public interface Character {
public void doAction();
}
你有2个角色,例如盟友和敌人。
public class Ally implements Character {
public void doAction() {
System.out.println("Defend");
}
}
public class Enemy implements Character {
public void doAction() {
System.out.println("Attack");
}
}
如您所见,两个类都实现了接口,但它们具有不同的操作。 现在,您可以创建一个实现您的界面并让它执行其操作的角色。根据它是敌人还是盟友,它会执行不同的行动。
public Character ally = new Ally();
public Character enemy = new Enemy();
在你的主程序中,你可以创建一个方法来接受任何实现你的界面的对象,让它执行它的动作而不知道它是什么类型的角色。
void characterDoAction(Character char) {
char.doAction();
}
如果您愿意为此方法提供联盟,则输出为:
Defend
如果你想给这个方法的敌人,输出将是:
Attack
我希望这是一个足够好的例子来帮助您了解使用接口的好处。
答案 1 :(得分:2)
界面驱动编程有很多优点。
What does "program to interfaces, not implementations" mean?
基本上你是在界面中定义一个契约,所有实现界面的类都必须遵守契约。
您的查询答案:
1.它只提供方法名称或骨架(这是界面的唯一优势)?
- >它不仅仅是提供方法名称,还定义了实现接口的类可以做什么。
2.使用MyInterface时我还能保存任何内存吗?
- >与记忆没什么关系
4.除此之外,使用界面还有更多优势。 - >很多,特别是依赖注入,模拟,单元测试等。
答案 2 :(得分:1)
这里可以找到一个非常好的解释when-best-to-use-an-interface-in-java。这实际上取决于您正在构建的内容以及您希望/不希望拥有多少可伸缩性,代码重复等。
答案 3 :(得分:1)
许多类使用接口来执行某些功能,依赖于其他程序员来实现与接口管理的契约相关的接口。例如,这些类是 KeyListeners,MouseListeners , Runnable 等。
例如:JVM知道如何处理Thread
,如何启动它,停止它,操纵它,但它不知道你的Thread
应该做什么,所以你必须实现Runnable
界面。
接口为您提供了一个抽象级别,可以在其他类中使用。例如,如果您有一个名为GemetricFigure
的接口,则在打印GeometricFigure
的 girth 的类中,您可以迭代所有 GeometricFigures的列表喜欢:
public class Canvas {
private List<GeometricFigure> figures;
public void print() {
for (GeometricFigure figure : figure) {
System.out.println(figure.getGirth());
}
}
}
如果GeometricFigure
只有那个方法:
public interface GeometricFigure {
public Double getGirth();
}
您不关心Square
或Circle
如何实现该界面。否则,如果没有接口,则Canvas
中没有 GeometricFigures 的列表,而是每种数字类型的列表。
答案 4 :(得分:0)
接口就像您的实现类应该满足的契约。通常,您将编写一个接口,并使其他所有类使用自己的实现来实现它。
示例:强>
interface IExporter {
public void export();
}
public class PDFExport implements IExporter {
public void export(){
//code for PDF Exporting
}
}
public class XLSExport implements IExporter {
public void export(){
//code for XLS Exporting
}
}
public class DOCExport implements IExporter {
public void export(){
//code for DOC Exporting
}
}
答案 5 :(得分:0)
使用界面方法,您可以执行以下操作:
List<MyInterface> list = new ArrayList<MyInterface();
list.add(new User1());
list.add(new User2());
for(MyInterface myInterface : list) {
myInterface.doClaculation()
}
这不适用于第二种方法。接口用于使用您的类的代码 - 不适用于您自己的类。
答案 6 :(得分:0)
在许多情况下,您可以使用接口。您所描述的情况也是如此:您无需了解您拥有的实施方案。
例如,你的代码中有一个方法,即使你不知道它是User1还是User2实现,它返回用户当前烧尽的方法,但是它们都可以通过方法doCalculation来计算。我添加了一个非常虚拟的例子:
public void dummyExampleCalculation() {
getCurrentUser().doCalculation();
}
public MyInterface getCurrentUser() {
if(...) {
return new User1();
} else {
return new User2();
}
}
答案 7 :(得分:0)
这就是面向对象编程的全部内容。Interfaces are used to perform polymorphism
。你说过,你可以在这两个类的code2中实现,如果将来有需要doCalculation
的user3会怎么样。您可以实现该界面并以自己的形式编写calculation
。
如果您想为所有用户提供基本功能abstract classes
,您可以在其中声明一个抽象方法do calculation
,并提供每个用户将扩展的基本功能的实现,可以doCalculation
以自己的方式。
答案 8 :(得分:0)
Java中的接口用于对类强制实施规则。这意味着您可以在接口中声明函数的签名,然后通过完全遵循函数签名在各种类中实现这些函数。
您可以在以下网页上看到一个清晰逼真的示例