Java中的继承和多态

我有两个类:Triangle和RightAngledTr. RightAngledTr继承自Triangle.代码如下:

三角类:

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

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

RightAngledTr类:

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.draw()调用RightAngleTr类的方法时,为什么tr.computeCentroid(rtr)会调用Triangle类的方法?

这没有意义. Liskov替代原则似乎不适用.

解决方法:

这就是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.

三角形(父级)包含RightAngledTr(子级)的引用,并且在子对象上调用draw()方法.它被称为重写功能.

孩子是父母的类型.父保持子实例调用子的重写方法.如果child中不存在method,则将调用parent方法.

覆盖是使用相同的签名重新定义基类(父)行为.如果更改子类中基类方法的签名,则称为重载.您已对其他方法执行了相同的操作:computeCentroid().

但是对于父和子中声明的相同变量,不要指望相同.

变量不会被覆盖.仅覆盖方法.

上一篇:c# – Foreach – 根据List中项目的类型不同的说明


下一篇:Java中的上传问题?