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

9

我是一名学生,在学习Java的过程中遇到了一个难以理解的概念,希望有人能为我解惑。我的问题是关于多态性。例如,假设我有以下代码:

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

  2. 另外,在创建a时将使用哪个类的构造函数?

感谢任何帮助。我已经搜索了很多资料。

3个回答

9

1. 根据我理解,由于变量类型是Animal,a将具有所有动物的特征。但是,由于创建的对象是蜥蜴类,因此Lizard类中重写的方法将被使用而不是Animal类中的方法。这个理解正确吗?

是的,你说得对。

2. 同时,在创建a时将使用哪个类的构造函数?

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

作为动物的一个子类,蜥蜴首先会调用它自己的构造函数,然后在蜥蜴构造函数中,默认情况下会调用super(),从而调用动物构造函数,除非你使用this()调用重载的蜥蜴构造函数。在动物构造函数中,第一行还会有一个super()的调用。假设动物没有扩展任何类,则会调用java.lang.Object的构造函数,因为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() 即调用动物类的无参构造函数
  3. 使用 super() 从动物类中调用 java.lang.Object 的构造函数
  4. java.lang.Object 的构造函数代码将被执行
  5. 动物类的构造函数代码将被执行
  6. 蜥蜴的构造函数代码将被执行

我还有一个快速的问题。如果这些属性只在蜥蜴类中,那么动物a是否会有String colorScales;和String lizardType;这样的属性? - Kevin Goodenough
不,它们对动物不可见。你可以使用一个简单的测试类快速测试以获得更好的理解 :) - PermGenError

0
  1. 即使引用类型为Animal,所有方法调用都将解析为Lizard中的定义(如果存在),否则将调用下一个直接父级中的版本。

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


0
  1. Lizard类中的任何重写方法都将代替Animal类中的方法。

    是的,你说得对。

  2. 在创建a时会使用哪个类的构造函数?

    当你创建一个子类时,它会隐式地调用超类的构造函数。因此,既会使用超类(也就是Animal)的构造函数,也会使用子类(也就是Lizard)的构造函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接