【问题标题】:Java polymorphism creating a subclass object using its superclass variableJava 多态性使用其超类变量创建子类对象
【发布时间】:2012-12-08 04:14:18
【问题描述】:

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

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

  2. 另外,创建一个类时会使用哪些类构造函数?

感谢您的帮助。我看起来很不错

【问题讨论】:

    标签: java polymorphism


    【解决方案1】:

    1.据我了解,由于变量类型是Animal,a将具有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. 将调用 Lizards 构造函数
    2. 除非 this() 调用重载构造函数,否则调用 super() 即调用的 Animals no-args 构造函数
    3. java.lang.Object 的构造函数将使用 super() 从 animal 调用
    4. java.lang.Object 的构造函数代码将执行
    5. 将执行动物构造函数代码
    6. 将执行 Lizards 构造函数代码

    【讨论】:

    • 非常感谢!这很有帮助。
    • 我还有一个简单的问题。 Animal a 是否具有诸如 String colorScales 之类的属性;和字符串蜥蜴类型;如果这些只是蜥蜴类?
    • 不,它们对动物是不可见的。您可以使用简单的测试类快速对其进行测试,以便更好地理解 :)
    【解决方案2】:
    1. 这是正确的,即使引用的类型是 Animal,所有方法调用都将解析为 Lizard 中的定义(如果存在),否则将调用下一个直接父级中的版本,依此类推.

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

    【讨论】:

      【解决方案3】:
      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-30
        • 2011-02-05
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        相关资源
        最近更新 更多