Полиморфизм, создание объектов
Есть супер-класс Animal, и у него есть подкласс Dog. Когда я создаю объект, в чем разница между
Animal animal = new Dog();
и
Dog animal = new Dog();
Приведите пример, где будет разница
Ответы (2 шт):
И в первом и во втором случае в переменной лежит объект класса 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.
если Dog будет переопределять методы Animal то в зависимости от сылки в которой лежит обьект будут вызыватся разные определения метода, например:
Animal animal = new Dog(); есть метод move() при вызове animal.move() если метод в класе Animal private, final или static то будет вызван метод Animal.move() иначе будет вызван метод переопределеный в наследнике тоисть Dog.move()
Dog animal = new Dog();
во втором случае у нас сылка типа Dog в которой лежит обькт типа Dog (а то что вы назвали сылку animal ниочем не говорит)