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



所以我是一名学生,正在学习Java。有一个概念我很难理解,我希望有人能为我阐明这一点。我的问题是关于多态性。举个例子,我有以下代码。

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

  2. 此外,在创建时将使用哪些类构造函数?

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

1.据我所知,由于变量类型为Animal,a将具有Animal的所有特征。但是,由于对象创建的是Lizard,则Lizard类中的任何重写方法都将而不是动物类中的那些。这是正确的吗>

是的,你是对的。

2.此外,在创建时将使用哪些类构造函数?

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

由于Lizard是Animal的子类,首先,Lizards构造函数将被调用,然后从Lizards构造器中,将调用Animal构造函数,因为默认情况下,Lizard构造函数中的第一行是super()。除非您使用this()用Lizard的重载构造函数uper()的调用。假设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 constructor
  3. java.lang.Object的构造函数将使用super()从animal调用
  4. java.lang.Object的构造函数代码将执行
  5. 动物构造函数代码将执行
  6. Lizards构造函数代码将执行
  1. 这是正确的,即使引用的类型是Animal,所有方法调用都将解析为Lizard中的定义(如果存在),否则将调用下一个直接父级中的版本,依此类推

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

  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的子类。

最新更新