如果我调用一个接口方法,它会从实现类中获取方法体并执行吗?

sij*_*sij 15 java interface

我有一个界面Interface1.我有它的实现Imple implements Interface1(所有方法都已实现:)).

现在,考虑第三课CheckCall,我可以在课堂上打电话,CheckCall如下所述:

Interface1 interface1;
interface1.method();
Run Code Online (Sandbox Code Playgroud)

所有必要的进口都已完成.请告诉我是否可能,如果不是那么好,如果是,那么告诉我如果我有多个实现类用于同一个接口并且我正在进行相同的调用会发生什么.

Syn*_*r0r 14

好吧,你不能直接在界面上调用方法,但你可以或多或少地做你写的.

你写了:

Interface1 interface1;
interface1.method();
Run Code Online (Sandbox Code Playgroud)

如果您这样做,这将有效:

Interface1 interface1 = new CheckCall();
interface1.method();
Run Code Online (Sandbox Code Playgroud)

然后告诉我如果我有同一个接口的多个impl类并且我正在进行相同的调用会发生什么

嗯,这是关于Java的好处:你所指的问题叫做"钻石问题":

http://en.wikipedia.org/wiki/Diamond_problem

它并不存在于Java中,因为Java完全支持多重继承,但只能通过"多(Java)接口继承"(*参见注释).

因此,在你打电话给interface1.method()你的情况下,你要么采用Impl方法,要么CheckCall采用方法,而且不会产生混淆.


sla*_*dan 7

当然,你的代码工作正常!您只需interface1使用实际实现初始化变量(即new Imple()).

看看这个例子,我使用了你的类名:

public class CheckCall {

    interface Interface1 {
        void method();
    }

    static class Imple implements Interface1 {
        @Override
        public void method() {
            System.out.println("Imple.method1()");
        }
    }

    public static void main(String[] args) {
        Interface1 interface1;
        interface1 = new Imple();
        interface1.method();
    }

}
Run Code Online (Sandbox Code Playgroud)