【问题标题】:what happens when a parent class object takes value of child class object当父类对象取子类对象的值时会发生什么
【发布时间】:2021-01-24 14:51:25
【问题描述】:

我在玩代码,看代码旁边的评论,我的问题是:

og是子类型还是父类型?

public static void main(String[] args)
{
    inherit og = new child();
    og.play();
    ( (child)og).kick((child)og);   //kick is a function in child class wi=hich accepts an object of the child class as parameter
    // gives an error if we remove explicit conversion
     System.out.println(og instanceof child);   //true
     System.out.println(og instanceof inherit);  //true
    System.out.println(og.getClass().getSimpleName());  //child
}

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

    它是child类型,因为你已经在这一行实例化了child

    inherit og = new child();
    

    并将新的child 实例分配给og

    【讨论】:

    • OP 可能有点不清楚他们真正想知道什么,但从这种解释中得出的问题之一是“如果 og 属于 child 类型,那么为什么一个需要强制转换以调用其kick() 方法吗?"
    • @JohnBollinger 因为 og 被声明为继承类型,所以它被称为继承类型是很自然的,尽管实际上在这个特定的代码示例中它是子类型。
    • 没有进一步的限定,这被过度简化到不正确的地步。 OP 代码中的 表达式 og 的类型是(参考)inherit。这不是什么是“自然”的问题。相反,它是由语言标准指定的。这就是为什么需要演员表的原因。这也是 variable og 的类型。 og 所引用的对象具有 child 类是另一回事。
    • @JohnBollinger instanceof for child 产生 true。这意味着它是儿童类型的。由于声明,它没有被视为这样,这使得强制转换是必要的。但是,它仍然是儿童类型的。如果您将 og 实例化为新继承,则 child 的 instanceof 将产生 false。说某事是“自然的”实际上意味着如果你使用你的常识,那么你就会明白为什么会这样。所以我觉得你最后的评论是不必要的吹毛求疵。
    • 说我不同意你的描述并不是挑剔。我绝不会质疑 og instanceof child 在 OP 的代码中将评估为 true。我要质疑的是这是否与 OP 想知道的有关。这是 OP 缺乏明确性的症结所在,它贯穿于您自己在谈论哪个“它”的问题。有变量og,如果选择区分,表达式og。还有og 所指的对象。这些不是一回事。
    【解决方案2】:

    对象“og”属于子类。这个过程称为多态性。因为“子”类扩展了“继承”类,所以对子类执行的任何命令也会调用父类(“继承”)的构造函数。

    当你说:

    og instanceof child
    og instanceof inherit
    

    这两个都说“true”的原因是因为你写了“Inherit og = new Child();”。因此,“Child()”会导致调用“Inherit”类中的构造函数。因此,“og”标识为两者。

    “孩子”也在调用“继承”构造函数。所以,这两个都是真的,因为两个构造函数都被调用了。然而,实际上答案是它是“child”类型的。

    【讨论】:

    • 我不同意第二句话和后面的句子。然而,至于第一个,OP 对于他们真正想知道的内容可能有点不清楚,但是从这种解释中得出的问题之一是“如果og 属于child 类型,那么为什么需要转换它以调用其kick() 方法?"
    【解决方案3】:

    og是子类型还是父类型?

    在示例代码中使用的片段

    inherit og
    

    og 声明为对类型 inherit 的对象的引用。这就是表达式og 的类型。这是所呈现的源代码的编译时特性。因此,og 属于父类型

    提供的代码还使用对 class child 的对象的引用来初始化变量 og。出于所有意图和目的,这是程序执行的运行时详细信息。它不会更改变量og 或表达式og 的类型,但它确实意味着在运行时,可以预期转换表达式(child) og 的评估会成功,而不是抛出ClassCastException

    T 类型的引用可以引用其类是 T 子类型的对象。这不会改变引用的类型或对象的类——这些是不同的考虑因素。我个人尝试通过使用您在此答案中看到的单词选择来保持区别:引用具有 type,而对象具有 class

    另外,请遵循标准 Java 命名约定。特别是,类应以驼峰式命名,首字母大写。遵循这一点和其他标准约定可以使您的代码更容易被其他人阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      相关资源
      最近更新 更多