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

为什么对接口的引用数组可以容纳实现该接口的类?

东方方伟
2023-03-14

我读过很多解释接口和抽象类之间差异的文章;这些帖子特别有用:接口和抽象类之间有什么区别?接口与抽象类(通用面向对象);然而,我找不到任何具体解决我问题的答案。

上下文:今天在课堂上,我们编写了一个接口和两个实现接口的类:

public interface Animal{ // This is in its own file
    void move();
    void makeSound();
}

class Dog implements Animal{  // The rest of these are in another file
    public void move(){
        System.out.println("Runs.");
    }
    public void makeSound(){
        System.out.println("Barks.");
    }
}

class Fish implements Animal{
    public void move(){
        System.out.println("Swims.");
    }
    public void makeSound(){
        System.out.println("Bloops.");
    }
}

public class Zookeeper{
    public static void main(String[] args){
        Animal[] zoo = new Animal[10]; // This an array of references to an interface
        for(int i = 0; i < zoo.length; i++){
            zoo[i] = (Math.round(Math.random()) == 0)?new Dog():new Fish();
        }
        for(Animal animal: zoo){
            System.out.println(animal.getClass().getName());
            animal.makeSound();
            animal.move();
        }
    }
}

我知道这是可能的,因为它有效;我的问题是它为什么有效?我知道子类与其超类有ISA关系,但接口根本不是类,那么继承仍然适用于它们吗?实现多个接口的类是否与这些接口有ISA关系?

这个问题可以进一步抽象为:为什么接口的引用变量可以包含实现该接口的类?

共有1个答案

林英朗
2023-03-14

你的动物[]持有动物,对。

但是当然,您知道狗也是动物,因此编译器可以将其视为动物,并将其作为动物添加到数组中。

当然,当您遍历数组时,编译器无法进一步假设哪个引用属于哪个类,因此循环中只有接口方法可用。

多态性的一个很好的观点。

编辑:也许你的问题更关心类与接口的差异,你想知道如何存储对接口实例的引用?

即使是前面的短语也很粗糙。这里没有接口实例,而是接口实现的实例。因此,你的动物[]实际上包含的是对实现该接口的任何类的实例的引用(即狗、鱼、NyanCat或你拥有的)。

还要注意,在前面的解释中,我并不真正关心类与接口的差异。编译器也不关心。它所关心的只是正确的类型,也就是说,您实际上不能将String添加到您的动物[]中,例如,而只是动物的派生/子类型。

强调强类型。

 类似资料:
  • 我对类上的接口实现的理解是,接口类型引用实现接口的类的对象。 但是当我研究下面的代码片段在上面的代码中使用时… GetConnection(host,username,password)返回对对象的引用(类型为Connection),但DriverManager类中没有实现接口。谁能澄清我的这个疑问..?还是我漏掉了什么? 下面的代码段不能得到相同的东西 createStatement()应该返回

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

  • 问题内容: 在现实世界中,人们将其用于(解决什么类型的问题)?我可以看到其中的一些示例代码吗?我所能找到的只是关于猫和狗说话或喝牛奶或咖啡的人的代码… 人们真的通过接口实现多态吗?做什么的? 问题答案: 当然, 下面是“观察者”模式的具体示例,该模式在记录器系统中使用类和接口来实现多态行为: 然后,您可以按以下方式使用它: 希望这有助于您理解接口和多态性。

  • 问题内容: 实现接口。接口没有方法。当我检查它没有实现接口。 那么,在实现的意义何在? 问题答案: 没有方法的接口在Java中称为标记接口。 根据RandomAccess的JavaDoc: List实现使用的标记接口,指示 它们支持快速(通常为恒定时间)随机访问。 有关更多信息,请检查两个JavaDoc页面。 http://docs.oracle.com/javase/6/docs/api/jav

  • 问题内容: 我刚刚发现Java允许枚举实现接口。有什么好的用例? 问题答案: 枚举不仅仅代表被动集(例如颜色)。他们可以代表与功能更复杂的对象,所以你可能想进一步功能添加到这些是那么-例如,你可能如接口,等等。支持这些和组件。

  • 问题内容: 什么时候应该实现接口? 我们为什么要这样做? 它具有任何优势或安全性吗? 问题答案: 从这是什么“系列化”的事情怎么一回事?: 它使您可以获取一个对象或一组对象,将它们放在磁盘上或通过有线或无线传输机制发送,然后稍后,也许在另一台计算机上,逆转该过程:恢复原始对象。基本机制是将一个或多个对象展平为一维比特流,并将该比特流转换回原始对象。 就像《星际迷航》中的“运输者”一样,所有事情都是