我有一个界面
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
。
答案 0 :(得分:2)
为什么调用(AA aa)类C的方法可以接受B类的实例?
因为班级B
也实施了接口AA
通过实现相同的接口,所有类都是相同的吗?
是。这就像有一个接口Animal
。当您的班级Dog
现在实施Animal
Dog
IS-A(n) Animal
时。如果Cat
实施Animal
,Cat
现在 IS-A(n) Animal
。
我只知道扩展同一类的多态性。但我不知道使用Interfaces。
多态性不仅限于扩展一个类。实现接口时也会发生这种情况。
在您的Student
和Teacher
类的给定示例中。假设您有一个名为SchoolGoer
的界面,而您的Student
和Teacher
实现了该界面,现在您可以说Student
和Teacher
的每个实例IS-A SchoolGoer
您现在可以执行以下操作:
SchoolGoer aTeacher = new Teacher();
SchoolGoer aStudent = new Student();
aTeacher.goToSchool();
aStudent.goToSchool();
由于它们都实现了SchoolGoer
接口,因此它们都可以执行SchoolGoer
所做的任何事情。在这种情况下goToSchool
。
答案 1 :(得分:1)
这是继承之美。它不是多态的。简单地说,我们可以用多种方式定义多态性"同样的事情"。您的程序AA
是一个界面。 B
是一个子类,继承自AA
接口。因此我们可以说
B
是AA
在C
类invoke(AA aa)
方法中接受任何AA
类型的内容。因此B
是AA
。因此该方法接受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");
}
});
}
}