通过接口的多态性

时间:2014-09-11 02:59:43

标签: java polymorphism

我有一个界面

public interface AA {
    public void sayHello();
}

并从一个类

实现它
public class B implements AA {

    @Override
    public void sayHello() {
        System.out.println("Hello !");
    }
}

并且一个类有一个参数类型为interface

的方法
public class C {
    public void invoke(AA aa) {
        System.out.println("Invoking !");
    }
}

在我的主课程中构建它们

public class Main {
    public static void main(String... args) {
        B b = new B();
        C c = new C();
        c.invoke(b);
    }
}

在我的控制台Invoking !输出。

我不太了解 Polymorphism 以防万一。为什么类{strong> C 的invoke(AA aa)方法可以接受类B的实例?通过实现相同的interface,所有类都是一样的吗?

举个例子:

我有 Student.java Teacher.java 类。如果他们implement一个接口只有一个方法gotoSchool()。他们可以通过这两个类实现的接口的参数类型传递任何方法吗?如果是这样,我可以假设学生班级和教师班级的实例相同吗?

请有人帮我解决我的想法有什么问题?我只知道当你extend同一个类时会发生多态。但我不了解实施interfaces

2 个答案:

答案 0 :(得分:2)

  

为什么调用(AA aa)类C的方法可以接受B类的实例?

因为班级B也实施了接口AA

  

通过实现相同的接口,所有类都是相同的吗?

是。这就像有一个接口Animal。当您的班级Dog现在实施Animal Dog IS-A(n) Animal时。如果Cat实施AnimalCat现在 IS-A(n) Animal

  

我只知道扩展同一类的多态性。但我不知道使用Interfaces。

多态性不仅限于扩展一个类。实现接口时也会发生这种情况。

在您的StudentTeacher类的给定示例中。假设您有一个名为SchoolGoer的界面,而您的StudentTeacher实现了该界面,现在您可以说StudentTeacher 的每个实例IS-A SchoolGoer

您现在可以执行以下操作:

SchoolGoer aTeacher = new Teacher();
SchoolGoer aStudent = new Student();
aTeacher.goToSchool();
aStudent.goToSchool();

由于它们都实现了SchoolGoer接口,因此它们都可以执行SchoolGoer所做的任何事情。在这种情况下goToSchool

答案 1 :(得分:1)

这是继承之美。它不是多态的。简单地说,我们可以用多种方式定义多态性"同样的事情"。您的程序AA是一个界面。 B是一个子类,继承自AA接口。因此我们可以说

  

BAA

Cinvoke(AA aa)方法中接受任何AA类型的内容。因此BAA。因此该方法接受B类对象。您无法提供AA实例(因为我们无法使用接口创建对象)。除了可以使用Annonymous class来运行该方法。就像这样......

class Main {
public static void main(String... args) {
    //B b = new B(); 
    C c = new C();
    c.invoke(new AA(){
      public void sayHello(){
      System.out.println("Annonymous class");
      }
    });

 }
}