Java继承

Java继承,java,inheritance,class,Java,Inheritance,Class,为什么打印最后一个是“我是一个孩子班” 输出: From Derived Child Constructor. I'm a Parent Class. I'm a Child Class. I'm a Parent Class. I'm a Child Class. 因为这是(后期绑定)的一个示例。在编译时指定对象的类型为Parent,因此只能调用Parent中定义的方法。但在运行时,当“绑定”发生时,将对对象调用该方法,该对象的类型为Child,无论它在代码中如何引用 让您感到惊讶

为什么打印最后一个是“我是一个孩子班”

输出:

From Derived

Child Constructor.

I'm a Parent Class.

I'm a Child Class.

I'm a Parent Class.

I'm a Child Class.

因为这是(后期绑定)的一个示例。在编译时指定对象的类型为
Parent
,因此只能调用
Parent
中定义的方法。但在运行时,当“绑定”发生时,将对对象调用该方法,该对象的类型为
Child
,无论它在代码中如何引用

让您感到惊讶的是,为什么应该在运行时调用重写方法。在Java中(与C#和C++不同),所有方法都是可重写的,因此调用重写方法。请参阅以了解差异。

两者:

child.print();

应返回:

I'm a Parent Class.
I'm a Child Class.
按这个顺序

将对象强制转换为其基类不会改变进行的方法调用。


在这种情况下,即使在强制转换之后,也会调用子print方法而不是父方法

即使您将子对象强制转换为父对象,这也不会更改其方法的实现。这实际上并没有使它成为一个家长。这就是为什么您可以执行以下操作:

Image img = new BufferedImage(...);

即使图像是抽象的,img下面仍然是一个BuffereImage。

即使您将其强制转换为父类,但这并不意味着它将使用其父类的函数——它将只将对象视为父类

通过说((父)子.print();您的意思是“将此对象视为父对象,而不是子对象”。不是“使用父方法实现”


因此,如果子对象有其他方法,您将无法调用它们。但是,由于print()是父对象的一个方法,您仍然可以调用它,但它使用实际对象(而不是它铸造到的类)的实现。

在java中,如果我们对一个对象调用任何方法,那么它会使用子对象来调用该方法。。。。。。。。。。。。。。。 在这里:

反对 | | 父母亲 | |
孩子问得好,回答得好。这在真实的节目中也是一件好事;如果您碰巧有一些调用父实现的代码,您的代码可能会中断。让我困惑的是,C#中的相同代码只打印“我是父类”继承,多态性在C#中的工作方式完全相同。但是,对于要在继承子类时重写的方法,c#需要virtual关键字,因此我猜您没有使用virtual,因此得到了不同的结果。
I'm a Parent Class.
I'm a Child Class.
Image img = new BufferedImage(...);
    child.print();
    ((Parent)child).print();
if we call like this jvm calls print () method by using sub most object here sub most  object is child object so it prints 

output::
          I'm a Parent Class.
          I'm a Child Class.