Если я вызову метод интерфейса, он получит тело метода из класса реализации и выполнит?
У меня есть интерфейс 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();
}
}