Использование интерфейсов в Java - PullRequest
3 голосов
/ 04 мая 2010

Предположим, есть интерфейс Displaceable и класс Circle, который реализует Displaceable. У Displaceable есть метод с именем move (), который, конечно, реализован в Circle.

Что произойдет в следующем сценарии?

Circle a =  new Circle(..);
Displaceable b = a;
b.move()

Будет ли объект ссылаться на метод перемещения Круга?

Ответы [ 4 ]

11 голосов
/ 04 мая 2010

Да, b.move () будет таким же, как вызов a.move () в вашем сценарии. Это полиморфизм в действии.

4 голосов
/ 04 мая 2010

Да.

Displaceable b говорит, что можно сделать с b . Компилятор может (и делает) проверять, доступен ли этот метод для этого типа (Displaceable) во время компиляции.

Как это сделать не обязательно ясно во время компиляции. Это зависит от реализации, во время выполнения, просто сделать это (переместить).

Во время компиляции обещание (я могу двигаться!) Проверяется. Во время выполнения код должен доказать, что он действительно может:)

Даже если бы Displaceable был классом , а не интерфейсом и реализовал сам move, фактическая move, называемая run-time, все равно была бы реализацией (если эта реализация, * 1021) *, переопределил бы реализацию Displaceable).

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

2 голосов
/ 04 мая 2010

Да. Круто, не правда ли? В этом красота полиморфизма.

Ради полноты я должен добавить, что если Circle расширяет некоторый другой класс, имеющий метод move(), возможно, что вызываемый метод не определен в Circle, но есть некоторый суперкласс.

В общем, у вас есть правильная идея.

2 голосов
/ 04 мая 2010

Да, абсолютно.

Это то же самое, что и это

void move(Displaceable b){
    b.move();
}

//somewhere else
move (new Circle(args));

move (new Square(args));

move (new Triangle(args));

Если подумать, это эквивалентно абстрактному суперклассу. Рисунок

public abstract class Figure{
     public abstract move();
}
//Circle extends Figure;

Figure f = new Circle(args);

f.move();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...