Интерфейсы и полиморфизм

Последнее обновление: 30.09.2025

Интерфейсы в преобразованиях типов

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

public class Program{
     
	public static void main(String[] args) {
         
		  Movable tesla = new Car("Tesla");
      tesla.move();
	}
}
interface Movable{

    void move();
}

// класс машины
class Car implements Movable{ 

    private String model;

    Car(String model){ this.model = model; }

    public void move(){

        System.out.println("Едем на машине");
    }

    public void print(){

        System.out.println("Модель: " + model);
    }
}

Здесь класс Сar реализует интерфейс Movable, соответственно переменная типа Movable может хранить ссылку на объект типа Car.

И если мы хотим обратиться к методам класса Car, которые определены не в интерфейсе Movable, а в самом классе Car, то нам надо явным образом выполнить преобразование типов:

public class Program{
     
	public static void main(String[] args) {
         
		  Movable tesla = new Car("Tesla");
      tesla.move();
      ((Car) tesla).print();      // Модель: Tesla

      // или через вспомогательную переменную
      Car someCar = (Car) tesla;
      someCar.print();        // Модель: Tesla
	}
}

Интерфейсы как параметры и результаты методов

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

public class Program{
      
    public static void main(String[] args) {
        
        Car car = new Car();
        travel(car);

        Movable boing = new Aircraft();
        travel(boing);  // Летим на самолете
    }

    static void travel(Movable obj)  {

        System.out.println("Отправляемся в путешествие");
        obj.move();
    }
}

interface Movable{

    void move();
}
// класс машины
class Car implements Movable{ 

    public void move(){

        System.out.println("Едем на машине");
    }
}
class Aircraft implements Movable{ 

    public void move(){

        System.out.println("Летим на самолете");
    }
}

В данном случае метод travel (условная функция путешествия на транспорте) в качестве параметра получает объект Movable. Это может быть машина, и самолет, и любой другой объект, класс которого реализует интерфейс Movable. Какой конкретно это будет объект, мы не знаем. Мы лишь знаем, что этот объект должен реализовать интерфейс Movable, а значит, иметь метод move.

Консольный вывод:

Отправляемся в путешествие
Едем на машине
Отправляемся в путешествие
Летим на самолете

ПРимер с возвращением объекта интерфейса:

public class Program{
      
    public static void main(String[] args) {
        
        Movable car = createMovable(true);
        car.move();

        Movable aircraft = createMovable(false);
        aircraft.move();
    }

    static Movable createMovable(boolean isCar)  {

        if(isCar) return new Car();
        return new Aircraft();
    }
}

interface Movable{

    void move();
}
// класс машины
class Car implements Movable{ 

    public void move(){

        System.out.println("Едем на машине");
    }
}
class Aircraft implements Movable{ 

    public void move(){

        System.out.println("Летим на самолете");
    }
}

Метод createMovable() в качестве результата возвращает объект интерфейса Movable. В качестве параметра метод принимает булевое значение, которое указывает, объект какого именно класса будет создаваться: если true, то создается объект Car, иначе создается объект Aircraft..

Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850
Morty Proxy This is a proxified and sanitized view of the page, visit original site.