我尝试了一些东西,但我不确定它为什么会起作用。
我有一个界面,然后我有一个具体的类。
接口有一个使用具体类的方法,该具体类实现了接口。
如果我调用已实现的方法,为什么这个工作?
public interface Interface {
public void greeting(ConcreteClass concreteClass);
}
public class ConcreteClass implements Interface {
public void greeting(ConcreteClass concreteClass) {
System.out.println("Hello World!");
}
}
public static void main (String[] args) {
ConcreteClass classObject = new ConcreteClass();
test.Interface interfaceObject = classObject;
interfaceObject.greeting(classObject);
}
答案 0 :(得分:4)
这正是polymorphism
的原因。
ConcreteClass classObject = new ConcreteClass();
test.Interface interfaceObject = classObject;
interfaceObject.greeting(classObject);
以上代码与
相同test.Interface interfaceObject = ConcreteClass();
interfaceObject.greeting(classObject);
将代码分为两部分 - 编译时和运行时。
在编译时,Java编译器会看到调用方法interfaceObject
的引用对象greeting()
具有相应的方法声明。所以它没有抱怨。
现在在运行时,JVM将知道该对象实际上是ConcreteClass
的实例,因此将调用相应的方法(假设ConcreteClass
通过提供{{1}的具体实现来正确实现Interface
方法)。
使用方法参数也没有限制,其引用类型与方法所属的类或接口的引用类型相同。
答案 1 :(得分:0)
您正在为interfaceObject分配classObject引用并调用greeting方法。 接口只是没有实现的超类。
答案 2 :(得分:0)
尽管这是完全可以接受的,但现在通常会尝试在类之间尽可能多地分离。考虑一个使用Interface
的模块也必须导入ConcreteClass
。
分离这些的自然方法是使用泛型。
public interface Interface<T extends Interface> {
public void greeting(T i);
}
public class ConcreteClass implements Interface<ConcreteClass> {
public void greeting(ConcreteClass concreteClass) {
System.out.println("Hello World!");
}
}