Полиморфизм Java, создающий объект подкласса с использованием его переменной суперкласса

Итак, я студент и изучаю Java. Есть одна концепция, которую мне трудно понять, и я надеюсь, что кто-то может пролить на нее свет. Мой вопрос касается полиморфизма. Скажем, например, у меня есть следующий код.

Animal a = new Lizard("Lizzy", 6);  //Lizard extends Animal
  1. Насколько я понимаю, поскольку тип переменной — животное, a будет иметь все характеристики животного. Но, поскольку созданный объект является ящерицей, любые переопределенные методы в классе ящерицы будут использоваться вместо тех, что в классе животных. Это правильно >

  2. Кроме того, какой конструктор классов будет использоваться при создании?

Спасибо за любую помощь. я посмотрел вполне


person Kevin Goodenough    schedule 08.12.2012    source источник


Ответы (3)


1. Насколько я понимаю, поскольку тип переменной — животное, a будет иметь все характеристики животного. Но, поскольку созданный объект является ящерицей, любые переопределенные методы в классе ящерицы будут использоваться вместо тех, что в классе животных. Это правильно>

да ты прав.

2. Кроме того, какой конструктор классов будет использоваться при создании?

          Animal a = new Lizard("Lizzy", 6);  //Lizard extends Animal

Поскольку Lizard является подклассом Animal, сначала будет вызван конструктор Lizards, затем из конструктора Lizards будет вызов конструктора Animal, так как первая строка в вашем конструкторе Lizard будет super() по умолчанию, если вы не вызываете перегруженный конструктор Lizard с помощью this(). В конструкторе животных будет еще один вызов super() в первой строке. предполагая, что Animal не расширяет какой-либо класс, будет вызван конструктор java.lang.Object's, поскольку java.lang.Object является суперклассом каждого объекта.

  public Object() {

    }
    Class Animal {
     public Animal(){
      //there will be a super call here like super()
    }

    class lizard extends Animal {
    public Lizard(your args) {
       //there will be a super() call here and this call's animal's no-args constructor
     }
    }

 }

Порядок выполнения будет

  1. Будет вызван конструктор Lizards
  2. если нет вызова this() для перегруженного конструктора, вызова super(), т.е. вызова конструктора Animals no-args
  3. Конструктор java.lang.Object будет вызываться из животного с помощью super()
  4. Код конструктора java.lang.Object будет выполняться
  5. Код конструктора животных будет выполняться
  6. Код конструктора Lizards будет выполняться
person PermGenError    schedule 08.12.2012
comment
Большое спасибо! Это было очень полезно. - person Kevin Goodenough; 08.12.2012
comment
У меня есть еще один быстрый вопрос. Будет ли Animal a иметь такие атрибуты, как String colorScales; и String lizardType; если бы они были только в классе ящериц? - person Kevin Goodenough; 08.12.2012
comment
нет, они не видны животным. вы можете быстро протестировать его, используя простой тестовый класс для лучшего понимания :) - person PermGenError; 08.12.2012

  1. Это правильно, даже если ссылка имеет тип Animal, все вызовы методов будут разрешаться в определение в Lizard, если оно присутствует, в противном случае будет вызвана версия в следующем непосредственном родительском элементе и так далее.

  2. a — это просто ссылка, а фактический объект имеет тип Lizard. Итак, будут вызываться конструкторы класса Lizard. Они, в свою очередь, могут вызывать конструкторы в суперклассах, используя super().

person Vikdor    schedule 08.12.2012

  1. Any overridden methods in the Lizard class will be used instead of those in the Animal class

    Да, ты прав

  2. which classes constructor will be used while creating a?

    Когда вы создаете подкласс, он неявно вызывает конструктор суперкласса. Следовательно, будут использоваться как суперкласс Animal, так и подкласс Lizard.

person bhuang3    schedule 08.12.2012