Полиморфный массив на основе Interface

В книге нашел следующий код:

interface Nose {
  public int iMethod();
}
abstract class Picasso implements Nose {
  public int iMethod(){
    return 7;
  }
}
class Clowns extends Picasso {}

class Acts extends Picasso {
   public int iMethods(){
     return 5;
   }
}
public class Of76 extends Picasso {
   public static void main (String [] args) {
     Nose[] i = new Nose[3];
     i[0] = new Acts();
     i[1] = new Clowns();
     i[2] = new Of76();
     for (int x = 0; x < 3; x++){
        System.out.println (i[x].iMethod() + " " + i[x].getClass() );
     }
  }
}

Интересует

Nose[] i = new Nose[3];
  1. Получается на основе Интерфейса можно создать список элементов, хотя те и не наследуются от него, а связь происходит через Picasso, который реализует его?

  2. В принципе

    class Acts extends Picasso {
    

можно заменить на

   class Acts implements Nose {
    

И все будет работать также?


Ответы (1 шт):

Автор решения: had0uken

В строчке

Nose[] i = new Nose[3];

создается массив с тремя переменными типа Nose, которые ссылаются на Null. А вот когда эти три элемента инициализируются - то тогда уже создаются объекты. Все типы (Acts, Clown ...) имеют реализацию метода iMethod(), поэтому вполне можно эти переменные сослать на объекты данных классов. При замене как вы хотите

class Acts extends Picasso {

на

 class Acts implements Nose {

Вам придется имплементировать все методы из Nose - в вашем случае метод iMethod(); И если вы его имплементируете - то да, все будет работать также, если не имплементируете - то код не пройдет компиляцию

Если рассматривать интерфейс как "контракт" (обязательство что какой-либо класс исполняет все методы из этого интерфейса). Если класс Пикасо соответствует данному критерию, то и все его субклассы также автоматически соответствуют этому критерию, так как они РАСШИРЯЮТ родительский класс, то есть гарантировано будут иметь этот метод (либо насследовать его из родительского класса, либо иметь собственную реализацию).

→ Ссылка