Если я вызову метод интерфейса, он получит тело метода из класса реализации и выполнит?

У меня есть интерфейс Interface1. У меня есть его реализация Imple implements Interface1 (все методы реализованы:)).

Теперь рассмотрим третий класс CheckCall, могу ли я сделать вызов в классе CheckCall, как я упоминал ниже:

Interface1 interface1;
interface1.method();

Все необходимые импортные операции были выполнены. Скажите, пожалуйста, возможно ли это или нет, если нет, тогда хорошо, и если да, тогда скажите мне, что произойдет, если у меня будет несколько классов реализации для одного и того же интерфейса, и я делаю тот же вызов.

Ответы

Ответ 1

Ну, вы не можете вызвать метод непосредственно на интерфейсе, но вы можете делать то, что вы написали, более или менее.

Вы писали:

Interface1 interface1;
interface1.method();

Это будет работать, если вы выполните следующее:

Interface1 interface1 = new CheckCall();
interface1.method();

тогда скажите мне, что произойдет, если я имеют более одного класса impl для тот же интерфейс, и я делаю тот же вызов

Хорошо, что хорошая вещь о Java: проблема, о которой вы говорите, называется "проблема с алмазом":

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

И это на самом деле не существует в Java, потому что Java полностью поддерживает множественное наследование, но только через "множественное (наследование интерфейса Java)" (* см. комментарий).

Итак, в вашем случае, когда вы вызываете interface1.method(), вы вызываете метод Impl или CheckCall, и нет путаницы.

Ответ 2

Конечно, ваш код работает отлично! Вам просто нужно инициализировать переменную 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();
    }

}

Ответ 3

Да, но не так, как вы его написали. Вы должны сказать:

Interface1 interface1 = new Imple();

Вы можете создать переменную типа Interface, а затем создать экземпляр класса, реализующего интерфейс. Вы видите это довольно часто с коллекциями Java, например:

List<String> a = new ArrayList<String>();

Ответ 4

Собственно, вы должны ссылаться на методы с помощью интерфейсов, которые их определяют, но вам нужен фактический класс реализации. Поэтому я обычно делаю это так:

// the variable is of type Interface1
Interface1 interface1 = new Imple();
// but the method will be executed on the Imple object
interface1.method();

Ответ 5

Нет, вам нужно сделать вызов объекта, который реализует интерфейс, а не самого интерфейса.

Изменить: переменную с этим типом можно использовать, но она все равно должна быть классом, который реализует этот тип. Вы не можете создать экземпляр интерфейса.

Ответ 6

Нет.

Поскольку вы не можете установить интерфейс, вам нужно создать объект Imple, чтобы использовать его как Interface1, например:

Interface1 interface1 = new Imple();

interface1.method();

на самом деле, основной интерес интерфейса связан с возможностью вернуть метод любому объекту, реализующему его, без необходимости беспокоиться о данной реализации. в вашем случае это может отображаться как

public class CheckCall {
    public Interface1 factoryMethod() {
        return new Imple();
    }

    public void test() {
        Interface1 used = factoryMethod();

        used.method();
    }
}