Прочитал статьи, смотрю видео и заметил вот такую конструкцию:
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
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости