【问题标题】:Java interface conceptJava接口概念
【发布时间】:2016-08-30 06:52:55
【问题描述】:

构建和接口时,有多少个类可以实现接口?
如果答案不止一个,那么当你调用接口(不是直接调用实现)时,java如何知道使用哪些实现?

【问题讨论】:

  • 你告诉Java它应该使用哪个实现!
  • 当你使用 import 时,你告诉 Java 使用哪个实现。
  • 实现接口的数量不限,设置引用时指定具体类型。
  • 你可以直接做一个接口,扩展两次试试。

标签: java interface


【解决方案1】:

有多少类可以实现接口?

只要你需要。

如果答案不止一个,那么当你调用接口(不是直接调用实现)时,java如何知道使用哪些实现?

这里帮助了解late binding(也称为动态绑定)。

假设你有实现它的接口和类

interface Animal{
    void makeSound();
}

class Cat implements Animal{
    public void makeSound(){
        System.out.println("mew");
    }
}

class Dog implements Animal{
    public void makeSound(){
        System.out.println("woof");
    }
}

你也有类似的代码

Animal a1 = new Cat();
Animal a2 = new Dog();

a1.makeSound();
a2.makeSound();

你会看到的结果是

mew
woof

发生这种情况是因为方法.makeSound()body/code 正在在运行时(而不是编译时)被查找(并调用)。这是可能的,因为每个对象都记得它的类,所以a1 引用持有的对象知道它是Cat 的实例,a2 持有的对象是Dog 的实例。

简而言之,当你这样做时:

a1.makeSound();
  • JVM 获取a1 持有的对象,
  • 然后向该对象询问其类(在这种情况下,它将知道它是Cat 类的实例),
  • 然后它将访问该类(Cat.class 文件)并搜索makeSound() 的代码(如果找不到此类方法,则假定它必须被继承,它将尝试在超类中搜索它)
  • 当它找到这个方法时,它会调用它的代码。

【讨论】:

  • 说得很好。谢谢。
  • @MarkoRocko 欢迎您。我忘了补充一点,由于这种机制,我们在 Java 中具有多态性。当您调用 .someMethod() 时,动态绑定也有 3 个例外。当代码在编译时设置并且在运行时不动态搜索时,第一个例外是方法为final(因为它不能被覆盖,所以在运行时搜索它没有意义)。第二种情况是方法是private(因为私有方法只能在声明的类中访问,而从其他类访问私有方法是不可能的)。
  • @MarkoRocko 第三种情况是方法为static,因为reference.staticMethod()在编译时更改为ReferenceType.staticMethod()
  • 无论如何,如果您认为这篇文章回答了您的问题,请随时accept it as solution
猜你喜欢
  • 2011-09-28
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2013-10-18
  • 2016-02-15
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多