当前位置: 首页 > 知识库问答 >
问题:

当普通类可以做同样的工作时,为什么真正需要接口[duplicate]

从建明
2023-03-14

我一直在想界面的真正用途。请检查下面的代码。

interface Animal {
    public void eat();
    public void travel();
}


public class MammalInt implements Animal{

    public void eat(){
        System.out.println("Mammal eats");
    }

    public void travel(){
        System.out.println("Mammal travels");
    } 

    public int noOfLegs(){
        return 0;
    }

    public static void main(String args[]){
        MammalInt m = new MammalInt();
        m.eat();
        m.travel();
    }
} 

在上面的代码中,如果我从类声明中删除了动物的实现,代码仍然可以正常工作,没有任何区别。那么界面的实际用途是什么呢?

共有2个答案

程禄
2023-03-14

接口的目的不是做事情,而是定义实现接口的类必须做的事情。在您的例子中,接口动物定义了可以在动物上调用的功能。因此,任何依赖于Animal接口的函数/类都知道实现Animal接口的类将实现哪些函数。

例如:假设有一种方法使动物旅行,例如:

 public void goToDestination(Animal a)
 {
     a.travel();
 }

现在,该函数可以在不知道对象的确切类型(可以是哺乳动物,也可以是两栖动物等)的情况下,调用类型为implementing Animal的对象上的函数travel。这就是接口的力量。这只是一个基本的界面外行解释,你可以谷歌和阅读更多关于界面。

高飞翮
2023-03-14

毫无疑问,即使此时没有接口,您的代码也能正常工作,但是。实现一个接口可以使一个类在其promise提供的行为方面变得更加正式。接口在类和外部世界之间形成契约,编译器在构建时强制执行该契约。如果类声明实现接口,则该接口定义的所有方法必须出现在其源代码中,然后该类才能成功编译。

例如,如果你有多个动物类,每个都实现了动物,如果以后你想改变动物界面的结构,它可以帮助你更容易地改变你所有动物类的结构。

另一个例子是,假设您处理一个组对象,领导者告诉您和其他人根据他给出的结构(接口)创建一些类,实现接口asures,确保所有方法名称和结构都正确。如果稍后领导决定类的结构不好,他将更改接口,迫使您更改类。

有关更多信息,请阅读什么是接口或未理解的接口及其有用性

 类似资料:
  • 问题内容: 我们需要大量的序列化工作,并且必须在使用的每个对象上指定标签,这是一种负担。特别是当它是第三方类时,我们不能真正更改。 问题是:由于是一个空接口,并且Java一旦添加便提供了可靠的序列化 为什么它们不使所有内容都可序列化,仅此而已? 问题答案: 序列化充满陷阱。这种形式的自动序列化支持使类内部成为公共API的一部分(这就是javadoc为你提供类的持久化形式的原因)。 为了实现长期持久

  • 问题内容: 在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。 我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。 这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。 有没有解释我为什么需要接口的示例? 问题答案: 接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。 接口是一种 工具

  • 我最近开始想,当我可以做一个具有完全相同功能的接口时,为什么还要使用抽象类。请考虑以下内容: 如果我有一个类实现这一点,我肯定会有一个整数a和一个方法printtext。 所以,我所看到的唯一区别是,通过接口,我创建的任何类都可以实现我想要的其他接口,但是通过扩展抽象类,我将不允许扩展更多的类。我为什么要选抽象类?我希望这个问题不是太宽泛,尽管我知道为什么有些人会这么认为。

  • 问题内容: 我正在进行硒学习,当我探索与键盘和鼠标主题的交互时,我找到了这段代码。在Robot类的帮助下,执行Enter: 在动作类的帮助下,执行Enter: 为什么我们需要两个班级执行相同的动作?Robot类和Actions类有什么区别?TIA。 问题答案: 机器人课 机器人类 在 java.desktop 模块的 java.awt 包中定义。此类用于处理与 Test Automation 相关

  • 我知道这是一个很基本的问题,但一个面试官用一种很诡计的方式问我,我很无奈:( 我只知道一个界面的材料或理论定义,并在我工作的许多项目中实现了它。但我真的不明白这为什么有用,怎么有用。 接口方面有一点我也不懂。例如,我们使用 finally块中的。但我没有看到该类实现或继承接口()类,我的意思是。我想知道怎么才能直接调用方法名。同样,我不理解Dispose方法是如何工作的,因为我们需要用我们自己的实