Java 中的继承和多态性

Inheritance and polymorphism in Java

我有 2 个 classes:TriangleRightAngledTrRightAngledTr 继承自 Triangle。代码如下:

Triangle class:

class Triangle {
    public void draw() { 
        System.out.println(“Base::draw\n“);
    }

    public void computeCentroid(Triangle t) {
        System.out.println Base::centroid\n“);
    }
}

RightAngledTr class:

class RightAngledTr extends Triangle {
    public void draw() { 
        System.out.println(“RightAngle::draw\n“);
    }

    public void computeCentroid(RightAngled t) {
        System.out.println(RtAngle::centroid\n“);
    }
}

在我的驱动程序中有以下代码行:

Triangle tr= new RightAngledTr ();
RightAngledTr rtr= new RightAngledTr ();
tr.computeCentroid(rtr);
tr.draw();
rtr.computeCentroid(tr);

我预期的输出是:

Base::centroid
Base::draw
Base::centroid

然而,我得到的输出是:

Base::centroid
RightAngle::draw
Base::centroid

我的问题是,为什么tr.computeCentroid(rtr)调用Triangleclass'方法,而tr.draw()调用RightAngleTrclass'方法?

没有意义。 Liskov 替换原则似乎不适用。

computeCentroid() 方法的签名不同。因此,您不是压倒一切,而是超载。

您正在调用专用对象上的绘制方法。即使你将它包装在基础 class 中,你也在调用重写的 draw 方法。

这就是 java 的工作原理。 draw() 方法被覆盖

查看 oracle documentation 文章以了解概念。

An instance method in a subclass with the same signature (name, plus the number and the type of its parameters) and return type as an instance method in the superclass overrides the superclass's method.

Triangle (parent) 持有 RightAngledTr (child) 的引用并且 draw() 方法在 child objects。这称为覆盖功能。

孩子的类型是 parents。 Parent 持有 child 实例调用 child 的覆盖方法。如果 child 中不存在方法,将调用 parent 方法。

Overriding 正在重新定义具有相同签名的基本 class (parent) 行为。如果你在childclass中改变baseclass方法的签名,就叫做重载。您对其他方法也做了同样的事情:computeCentroid().

但不要期望在 parent 和 child 中声明的相同变量相同。

变量未被覆盖。只有方法被覆盖.