Интерфейс в качестве типа

 

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

IFigure f = new IFigure(); // Ошибка!

 

С другой стороны в переменную типа интерфейса мы можем записать любой класс, реализующий этот интерфейс. Например, в интерфейс IFigure из прошлой программы мы можем записать класс Rect:

IFigure f = new Rect(2, 4);

 

Это оказывается весьма удобным - так как реальный тип переменной нам может быть не известен на этапе компиляции. Известен же он может быть только на этапе выполнения программы.

 

Вот так может быть переделан тестовый класс из программы выше:

public class Test {

public static void main(String[] args) {

IFigure[] f = new IFigure[2];//= //new Rect(2, 4);

f[0] = new Rect(2, 4);

f[1] = new Circle(1);

for (int i = 0; i < 2; i++){

System.out.println("Square[" + i + "]: " + f[i].square());

}

}

}

 

Обратите внимание, что тут мы в переменные типа интерфейса (у нас массив из 2-х переменных такого типа) записываем классы-потомки этого интерфейса (а именно Rect и Circle). И в момент вызова метода square интерфейса фактически вызовется метод из соответствующего класса, реализующего этот интерфейс. Т. е. площадь для прямоугольника будет считаться по его формуле, а для круга - по его.