如果无法实例化接口,那么在此示例中从Google Maps团队传递接口对象的工作原理是什么?

时间:2014-10-10 11:35:51

标签: java android google-maps interface

编辑:将methodsA更改为someMethod无处不在

this教程中,界面定义如下:

public interface MyInterface{
    public int someMethod();

    public class ClassA implements MyInterface{
        @Override
        public int someMethod(){
            //codeA
        }
    }

    public class ClassB implements MyInterface{
        @Override
        public int someMethod(){
            //codeB
        }
    }

}

然后他们在另一个类的方法中传递了上述接口的实例,如下所示:

public class MyAnimationClass{

    static void animate(final MyInterface myInterface){
        myInterface.someMethod();
    }

}

接口的实例化如何工作?此外,在语句myInterface.someMethod();中,someMethod()默认调用哪个类 - ClassA或ClassB?

2 个答案:

答案 0 :(得分:0)

您不实例化接口,实例化实现接口的类。 使用该对象的代码只需要知道接口,而不是实现类。

这是方法调用中发生的情况。该方法知道该参数实现了该接口。它现在可以调用接口中定义的所有方法。实际调用哪种方法取决于实现类。如果我将ClassA的对象传递给方法,则将调用ClassA的methodA()。如果我传递一个ClassB对象,它将调用ClassB的methodA()。

答案 1 :(得分:0)

这是基本的OO,我建议您阅读有关该主题的书籍,以进一步熟悉这些概念。

要回答您的问题,请不要实例化界面。您实例化一个实现接口的类。

在您提到的教程中,LatLngInterpolator从未实例化。 在示例代码之外,实例化线性 LinearFixed 球形

然后在某些时候他们被传递到

 static void animateMarkerToHC(final Marker marker, final LatLng finalPosition, final LatLngInterpolator latLngInterpolator) 

只能看到它的接口方面的方法。

您可以在本地计算机上运行的简单示例:

public class InterfaceExample {

public static void main(String[] argv) {
    PrintApple applePrinter = new PrintApple();
    PrintPear pearPrinter = new PrintPear();

    printObject(applePrinter);
    printObject(pearPrinter);
}

public static void printObject(PrintInterface p) {
    p.printMe(System.out);
}

public static interface PrintInterface {
    public void printMe(PrintStream p);
}

public static class PrintApple implements PrintInterface {
    public void printMe(PrintStream p) {
        p.println("apple");
    }
}

public static class PrintPear implements PrintInterface {
    public void printMe(PrintStream p) {
        p.println("pear");
    }
}

}

观察到只要printObject方法可以检测到它就获得PrintInterface。 编译器确保显式转换,您输入的对象必须实现此接口。

这非常接近您所看到的教程。

我认为你困惑的一件事是在界面内部,其他类被定义。这是您应该阅读的常见做法。 (内部类,静态内部类)