Класс, создание объекта, конструктор

103
28 мая 2019, 23:20

Прочитал статьи, смотрю видео и заметил вот такую конструкцию:

 Animal animal = new Dog(); 

Где автор сказал: Объект класса Dog типа Animal.

Давайте разберем:

  1. Animal - это класс
  2. animal - это название объекта
  3. new - ключевое слово, которое отвечает за создание объекта
  4. Dog() - конструктор

Не пойму почему он сказал:

Объект класса Dog типа Animal.

Я привык вот к такому:

Animal animal = new Animal();

Почему у нас здесь создается объект класса Dog?

Animal animal = new Dog(); 

Если у нас класс и название Animal animal, а new Dog() получается создание конструктора или у нас new Dog() это значит создание объекта, тогда почему это создание объекта если у нас Dog() это конструктор? Почему создается объект?

Почему еще говорят класс это и есть объект?

Answer 1

Почему у нас здесь создается объект класса 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();.

Answer 2

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
READ ALSO
Scheduled annotation

Scheduled annotation

Как использовать scheduled аннотация из спринга?допустим есть какой то метод который удаляет данные из БД MYSQL можно ли сделать так что с помощю...

132
Почему я всегда получаю 0 в Math.random() [закрыт]

Почему я всегда получаю 0 в Math.random() [закрыт]

Не понимаю почему всегда возвращает 0

96
Как нарисовать изолинии по точкам на Java?

Как нарисовать изолинии по точкам на Java?

Есть массив точек (X, Y, Высота(Z)), мне нужно изобразить изолинии по этим точкам, типа вот такого:

129
Вызов хранимой процедуры в Java

Вызов хранимой процедуры в Java

Есть процедура в БД Oracle:

139