所以我是一名学生,正在学习Java。有一个概念我很难理解,我希望有人能为我阐明这一点。我的问题是关于多态性。举个例子,我有以下代码。
Animal a = new Lizard("Lizzy", 6); //Lizard extends Animal
据我所知,由于变量类型为Animal,a将具有Animal的所有特征。但是,由于创建的对象是Lizard,因此将使用Lizard类中的任何重写方法,而不是Animal类中。这是正确的吗>
此外,在创建时将使用哪些类构造函数?
感谢您的帮助。我看起来很
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
}
}
}
执行顺序为
- 将调用Lizards构造函数
- 除非有对重载构造函数的this()调用,否则对super()的调用,即调用的Animals no args constructor
- java.lang.Object的构造函数将使用super()从animal调用
- java.lang.Object的构造函数代码将执行
- 动物构造函数代码将执行
- Lizards构造函数代码将执行
-
这是正确的,即使引用的类型是
Animal
,所有方法调用都将解析为Lizard
中的定义(如果存在),否则将调用下一个直接父级中的版本,依此类推 -
a
只是一个引用,而实际对象的类型是Lizard
。因此,Lizard
类中的构造函数将被调用。反过来,它们可以使用super()
调用超类中的构造函数。
-
Any overridden methods in the Lizard class will be used instead of those in the Animal class
是的,你是对的
-
which classes constructor will be used while creating a?
当您创建一个子类时,它将隐式调用超级类的构造函数。因此,将同时使用作为
Animal
的超类和作为Lizard
的子类。