Прочитал статьи, смотрю видео и заметил вот такую конструкцию:
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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как использовать scheduled аннотация из спринга?допустим есть какой то метод который удаляет данные из БД MYSQL можно ли сделать так что с помощю...
Есть массив точек (X, Y, Высота(Z)), мне нужно изобразить изолинии по этим точкам, типа вот такого: