Java多态性使用其超类变量创建子类对象

时间:2012-12-08 04:14:19

标签: java polymorphism

所以我是一名学生,正在学习Java。有一个概念,我很难抓住,我希望有人可以为我揭示这一点。我的问题是关于多态性。比方说,我有以下代码。

Animal a = new Lizard("Lizzy", 6);  //Lizard extends Animal
  1. 据我所知,由于变量类型是Animal,因此具有Animal的所有特征。但是,由于创建的对象是Lizard,因此将使用Lizard类中的任何重写方法而不是Animal类中的方法。这是正确的>

  2. 此外,在创建?

  3. 时将使用哪些类构造函数

    感谢您的帮助。我看起来很不错

3 个答案:

答案 0 :(得分:9)

  

1.根据我的理解,由于变量类型是Animal,因此将具有Animal的所有特征。但是,自从这个对象   created是一个Lizard,Lizard类中的任何重写方法都会   用来代替Animal类中的那些。这是正确的>

是的,你是对的。

  

2.此外,在创建?

时将使用哪些类构造函数
          Animal a = new Lizard("Lizzy", 6);  //Lizard extends Animal

因为,Lizard是Animal的子类,首先,将调用Lizards构造函数,然后从Lizards构造函数中,将会调用 Animal构造函数,因为Lizard构造函数中的第一行将是 super()默认情况下,除非您使用 this()调用Lizard的重载构造函数。在Animal构造函数中,第一行中将再次调用 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. 将调用蜥蜴构造函数
  2. 除非对重载的构造函数进行this()调用,否则调用super()即调用动物no-args构造函数
  3. java.lang.Object的构造函数将使用super()
  4. 从动物调用
  5. java.lang.Object的构造函数代码将执行
  6. 动物构造函数代码将执行
  7. 蜥蜴构造函数代码将执行

答案 1 :(得分:0)

  1. 这是正确的,即使引用的类型为Animal,所有方法调用都将解析为Lizard中的定义(如果存在),否则下一个直接父级中的版本将是叫来等等。

  2. a只是一个引用,实际对象的类型为Lizard。因此,将调用Lizard类中的构造函数。反过来,它们可以使用super()来调用超类中的构造函数。

答案 2 :(得分:0)

  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