Concrete类实现了一个接口,该接口知道实现它的具体类

时间:2015-03-20 16:05:56

标签: java

我尝试了一些东西,但我不确定它为什么会起作用。

我有一个界面,然后我有一个具体的类。

接口有一个使用具体类的方法,该具体类实现了接口。

如果我调用已实现的方法,为什么这个工作?

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);

}

3 个答案:

答案 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!");
    }

}