Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当父类对象接受子类对象的值时会发生什么_Java_Oop_Inheritance - Fatal编程技术网

Java 当父类对象接受子类对象的值时会发生什么

Java 当父类对象接受子类对象的值时会发生什么,java,oop,inheritance,Java,Oop,Inheritance,我在玩代码,看到除了代码之外的注释,我的问题是: 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 paramet

我在玩代码,看到除了代码之外的注释,我的问题是:

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
}

它属于
child
类型,因为您在这一行中实例化了
child

inherit og = new child();
并将新的
child
实例分配给
og

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

当你说:

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

“child”也在调用“inherit”构造函数。这两个都是真的,因为两个构造函数都被调用了。然而,在现实中,答案是它属于“儿童”类型

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
}
正如在示例代码中使用的,片段

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

给出的代码还使用类
子对象的引用初始化变量
og
。出于所有目的,这是程序执行的运行时细节。它不会更改变量
og
或表达式
og
的类型,但它确实意味着在运行时,可以预期对强制转换表达式
(子)og
的求值会成功,而不是抛出
ClassCastException

类型为
T
的引用可以引用其类为
T
子类型的对象。这既不会改变引用的类型,也不会改变对象的类——这是不同的考虑因素。我个人试图通过使用这个答案中的单词选项来保持这种区别:引用有一个类型,而对象有一个类


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

OP可能有点不清楚他们真正想知道什么,但从这个解释中得出的问题包括“如果
og
属于
child
类型,那么为什么需要强制转换它才能调用它的
kick()
方法?“@JohnBollinger因为og被声明为继承类型,所以它被称为继承类型是很自然的,尽管在这个特定的代码示例中,实际上它是子类型。如果没有进一步的限定,这将过于简单,以至于不正确。OP代码中表达式
og
的类型为(参考)
inherit
。这不是什么是“自然”的问题;相反,它是由语言标准规定的。这就是为什么需要演员阵容。这也是变量的类型
og
og
引用的对象具有class
child
是另一回事。@JohnBollinger instanceof for child产生true。这意味着它属于儿童类型。由于声明的缘故,人们并不这么认为,这使得强制转换成为必要。但它仍然是儿童型的。如果将og实例化为new inherit,则instanceof for child将产生false。说一些东西是“自然的”就意味着如果你运用你的常识,你就会明白为什么会这样。所以我觉得你最后的评论是不必要的吹毛求疵。说我不同意你的描述不是吹毛求疵。在OP的代码中,
og instanceof child
将计算为
true
,对此我没有异议。我想问的是这是否与OP想知道的有关。这是OP缺乏清晰性的症结所在,它贯穿了你自己所谈论的“it”的问题。有变量
og
,如果选择区分,还有表达式
og
。还有
og
引用的对象。这些不是同一件事。我不反对第二句和下面的句子。然而,对于第一个问题,OP可能有点不清楚他们真正想知道什么,但是从这个解释中引出的问题是“如果
og
child
类型,那么为什么需要强制转换它才能调用它的
kick()
方法?”