Прочитал статьи, смотрю видео и заметил вот такую конструкцию:
Animal animal = new Dog();
Где автор сказал: Объект класса Dog типа Animal.
Давайте разберем:
Не пойму почему он сказал:
Объект класса Dog типа Animal.
Я привык вот к такому:
Animal animal = new Animal();
Почему у нас здесь создается объект класса Dog?
Animal animal = new Dog();
Если у нас класс и название Animal animal, а new Dog()
получается создание конструктора или у нас new Dog()
это значит создание объекта, тогда почему это создание объекта если у нас Dog() это конструктор? Почему создается объект?
Почему еще говорят класс это и есть объект?
Почему у нас здесь создается объект класса Dog?
Потому что класс Dog
скорее всего наследует класс Animal
.
тогда почему это создание объекта если у нас Dog() это конструктор?
Dog
- не конструктор, а класс. Но при создании animal
используется конструктор из класса Dog
.
Почему еще говорять класс это и есть объект?
Потому что классы описывают объекты.
Animal animal = new Dog();
- создается ссылка на класс Dog типа Animal
. Т.е., так же как у примитивной переменной тип int
, у animal
- тип Animal
(но ссылается она все равно на Dog
).
Для чего это надо? Приведу пример. У вас есть три класса: Animal
, Dog
, Hourse
.
class Animal{
int speed;
boolean live;
String name;
public void speedUp() {speed++;}
}
class Dog() extends Animal{
public Dog(int speed, boolean live, String name) {
super.speed = speed;
super.name = name;
super.live = live;
}
}
class Hourse() {
public Hourse(int speed, boolean live, String name) {
super.speed = speed;
super.name = name;
super.live = live;
}
}
У вас нет необходимости переписывать все переменные и методы которые есть в Animal
в класс Hourse
и Dog
.
Допустим, у вас есть список животных(пусть называется pen, с англ. - загон). И вам надо поместить в загон всех животных, и собак, и коров, и лошадей. Тогда вы просто объявляете список ArrayList<Animal> pen = new ArrayList<>();
, и можете помещать туда всех животных(в нашем случае animal
, хотя корректнее было бы назвать переменную Dog
. Но не один объект dog
, а объекты hourse1
, hourse2
, dog10
, их классы наследуют класс Animal
).
Пример с кодом:
ArrayList<Animal> pen = new ArrayList<>();
Animal hourse1 = new Hourse(0, true, "1");
Animal hourseBlack = new Hourse(); //не указываю параметры
Animal hoursePink = new Hourse();
Animal bigDog = new Dog();
pen.add(hourse1);
pen.add(hourseBlack);
pen.add(hoursePink);
pen.add(bigDog);
Это только одно преимущество использования полиморфизма. Другое, как я уже писал в статье - реюзабельность кода, когда вы можете в одном классе(Animal
) прописать одинаковое поведение для наследников(Dog
, Hourse
). Поэтому вы можете сделать вот так: hourse1.speedUp();
bigDog.speedUp();
.
Animal
- это суперкласс для каких-то (абстрактных) животных. Dog
- его подкласс (дочерний). Поэтому мы можем объявлять переменную более абстрактного типа, создавая объекты разных подклассов. Это используется в полиморфизме, когда, например, мы хотим в список или массив поместить много животных (подклассов класса Animal
) и оперировать ими, например, вызывать их метод fly()
...
Еще пример, мы имеем интерфейс interface Sort
, в котором прописан метод sort(...)
. И у нас есть несколько классов, реализующих этот интерфейс (к примеру, QuickSort
, MergeSort
etc...). Тогда мы можем создать несколько переменных типа Sort
и использовать их, подставляя в нужное место в зависимости от нужного нам алгоритма:
Sort sort;
sort = new MergeSort();
sort.sort(...); // используем алгоритм mergeSort
sort = new QuickSort();
sort.sort(...); // используем алгоритм quickSort
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как использовать scheduled аннотация из спринга?допустим есть какой то метод который удаляет данные из БД MYSQL можно ли сделать так что с помощю...
Есть массив точек (X, Y, Высота(Z)), мне нужно изобразить изолинии по этим точкам, типа вот такого: