9

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

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

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

谢谢你的帮助。我看起来很

4

3 回答 3

9

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
     }
    }

 }

执行顺序是

  1. 蜥蜴构造函数将被调用
  2. 除非 this() 调用重载构造函数,否则调用 super() 即调用的 Animals no-args 构造函数
  3. java.lang.Object 的构造函数将使用 super() 从动物调用
  4. java.lang.Object 的构造函数代码将执行
  5. Animals 构造函数代码将执行
  6. 蜥蜴构造函数代码将执行
于 2012-12-08T04:22:42.390 回答
0
  1. 这是正确的,即使引用是 type Animal,所有方法调用都将解析为Lizard如果存在的定义,否则将调用下一个直接父级中的版本,依此类推。

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

于 2012-12-08T04:20:01.690 回答
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

于 2012-12-08T04:20:07.017 回答