Полиморфизм, создание объектов

Есть супер-класс Animal, и у него есть подкласс Dog. Когда я создаю объект, в чем разница между

Animal animal = new Dog();

и

Dog animal = new Dog();

Приведите пример, где будет разница


Ответы (2 шт):

Автор решения: FatCatStudent

И в первом и во втором случае в переменной лежит объект класса Dog

Когда у вас написано Animal animal = new Dog(); java знает что перед ним, в переменной animal, животное, объект класса/подкласса Animal, он не знает что это конкретно собака, но знает что этот объект животное и имеет все его свойства, а соответственно может обращаться только к тем методам или полям, что есть в классе Animal

Во втором случае, когда написано Dog animal = new Dog();, java точно знает что там объект класса/подкласса Dog, а так же знает что Dog это подкласс класса Animal. И в этом случае мы можем пользоваться методами и полями не только класса Animal, как в первом случае (хотя там тоже Dog, только java об этом не знает), но ещё и методами и полями класса Dog

Как пример, можно сказать что любое животное может двигаться, т.е. у Animal есть метод move(). А любая собака может ещё и лаять, т.е. у класса Dog есть метод bark(), а так же собака это животное, т.е. она и двигаться умеет (имеет метод move()).

Так вот в первом случае, имея переменную класса Animal, хоть в ней и лежит объект класса Dog, java об этом не знает. Она знает что этот объект как минимум животное, и оно может двигаться, всё. Максимум что мы можем сделать это вызвать метод move.

А во втором случае, мы точно знаем что там, в переменной, экземпляр класса/подкласса Dog, а значит этот экземпляр кроме как двигаться (ведь Dog это и Animal тоже), ещё и должен уметь лаять, а значит можем вызвать и метод move и метод bark.

→ Ссылка
Автор решения: denis Krivorutchko

если Dog будет переопределять методы Animal то в зависимости от сылки в которой лежит обьект будут вызыватся разные определения метода, например:

Animal animal = new Dog(); есть метод move() при вызове animal.move() если метод в класе Animal private, final или static то будет вызван метод Animal.move() иначе будет вызван метод переопределеный в наследнике тоисть Dog.move()

Dog animal = new Dog();

во втором случае у нас сылка типа Dog в которой лежит обькт типа Dog (а то что вы назвали сылку animal ниочем не говорит)

→ Ссылка