当前位置: 首页 > 面试题库 >

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

秦弘亮
2023-03-14
问题内容

因此,我是一名学生,正在学习Java。有一个概念让我难以把握,希望有人可以为我提供一些启示。我的问题是关于多态性。例如,假设我有以下代码。

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

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

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


问题答案:

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

是的,你是对的。

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

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

由于Lizard是Animal的子类,因此首先将调用Lizards构造函数,然后从Lizards构造函数进行调用,因为默认情况下,除非您调用 重载,
否则Lizard构造 函数 中的第一行将是 super() 。蜥蜴的 构造函数 使用 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的Constructor将使用super()从动物调用
  4. java.lang.Object的构造函数代码将执行
  5. 动物构造函数代码将执行
  6. 蜥蜴的构造函数代码将执行


 类似资料:
  • 问题内容: 一本书的引用: 如果要从超类的变量引用的对象中调用由子类定义的方法,该怎么办?假定SoftBall类具有一个名为BallBall类未定义的方法riseBall。如何从Ball变量中调用它?一种方法是创建子类的变量,然后使用赋值语句强制转换对象: 在上面的代码片段中,它显示了一个新的 Softball 对象,该对象正在创建并分配为对变量 b 的引用,这是完全合法的,因为类 Softbal

  • 在上面的代码片段中,它显示了一个新的Switterball对象被创建并赋值为变量b的引用,这是完全合法的,因为Switterball类是Ball类的子类。但是引号(间接地)指出,在使用该变量从垒球类调用方法之前,必须将该变量强制转换为垒球类型。为什么会这样?为什么我不能直接使用Ball类型的变量b(它包含对垒球对象的引用)来调用所需的方法?变量b已经有了对象。 (注:我已经读过这篇文章了。)

  • 问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。

  • 假设我在Java中有一个类Animal和3个子类。结构如下所示 我想在breed类中创建另一个对象,但我想创建同一个子类的对象,方法breed()就是从这个子类执行的。例如,如果执行了,我想在那里创建一个新的Frog对象(因为summing Frog是一个Frog对象),如果执行了,我想创建一个新的bear对象,等等。 有没有办法在动物类中处理,或者我必须在每个子类中重写方法?

  • 问题内容: 我试图找到有关此信息,但空手而归: 我认为可以使用反射或代理在Java中动态创建类,但我不知道如何做。我正在实现一个简单的数据库框架,在其中使用反射创建SQL查询。该方法获取具有数据库字段作为参数的对象,并基于该对象创建查询。但是,如果我还可以动态创建对象本身,那将非常有用,这样我就不必为每个表都拥有一个简单的数据包装对象。 动态类只需要简单的字段(,,),例如 这可能吗,我该怎么做?

  • 我在Java中读到了关于将超类变量类型化为子类的知识,反之亦然。请告诉我哪些是有效的? 动物是超级类,有猫和狗子类。