1.据我了解,由于变量类型是Animal,a将具有Animal的所有特征。但是,由于创建的对象是 Lizard,因此将使用 Lizard 类中的任何重写方法,而不是 Animal 类中的方法。这是正确的>
是的,你是对的。
2.另外,创建一个时会使用哪些类的构造函数?
Animal a = new Lizard("Lizzy", 6); //Lizard extends Animal
因为,Lizard 是 Animal 的子类,首先,将调用 Lizards 构造函数,然后从 Lizards 构造函数调用Animal 构造函数,因为 Lizard 构造函数中的第一行默认为super(),除非你调用重载Lizard 的构造函数使用this()。在 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
}
}
}
执行顺序是
- 蜥蜴构造函数将被调用
- 除非 this() 调用重载构造函数,否则调用 super() 即调用的 Animals no-args 构造函数
- java.lang.Object 的构造函数将使用 super() 从动物调用
- java.lang.Object 的构造函数代码将执行
- Animals 构造函数代码将执行
- 蜥蜴构造函数代码将执行