铸造 - (基础)o-它到底做了什么?

时间:2011-09-13 13:08:02

标签: java static-members

class Rectangle {}

class ColoredRectangle extends Rectangle {}

class Base {
    void foo(Rectangle x) {
        System.out.println("Base: foo(Rectangle)");
    }
}

class Sub extends Base {
    @Override
    void foo(Rectangle x) {
        System.out.println("Sub: foo(ColoredRectangle)");
    }
}

public class WhatHappensHere {

    public static void main(String[] args) {
        Sub o = new Sub();
        Rectangle rc = new ColoredRectangle();

        ((Base) o).foo(rc);
    }
}

我很难意识到这个(Base) o是否会更改o的静态类型。我记得我在这里被告知它不会改变它,那它是做什么的?为什么我需要这样做?在什么条件和目的?

由于

2 个答案:

答案 0 :(得分:3)

它不会更改o的静态类型,因为表达式o仍然是Sub类型 - 但表达式(Base) o的类型为Base }。我认为你的意思是它不会改变o引用的对象的类型。在这种情况下,没有任何目的可以转换为Base。它不会更改foo()调用的执行。然而,有各种不同的情况,

答案 1 :(得分:1)

它什么都不做。在其他一些语言中,这可能会调用foo中定义的Base,但在这种情况下,它仍会调用Sub.foo