所以我是一名学生,正在学习Java。有一个概念,我很难抓住,我希望有人可以为我揭示这一点。我的问题是关于多态性。比方说,我有以下代码。
Animal a = new Lizard("Lizzy", 6); //Lizard extends Animal
据我所知,由于变量类型是Animal,因此具有Animal的所有特征。但是,由于创建的对象是Lizard,因此将使用Lizard类中的任何重写方法而不是Animal类中的方法。这是正确的>
此外,在创建?
感谢您的帮助。我看起来很不错
答案 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 :(得分:0)
这是正确的,即使引用的类型为Animal
,所有方法调用都将解析为Lizard
中的定义(如果存在),否则下一个直接父级中的版本将是叫来等等。
a
只是一个引用,实际对象的类型为Lizard
。因此,将调用Lizard
类中的构造函数。反过来,它们可以使用super()
来调用超类中的构造函数。
答案 2 :(得分:0)
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
。