施加到超级不按预期工作

时间:2011-10-04 14:59:59

标签: java

为什么第二次通话会产生它的作用?我认为通过将this转换为Super,只应调用Super's m1() !!

Super!
And Sub!
---
Super!
And Sub!

代码:

public class TestSuper {
    public static void main(String[] args) {
        (new Sub()).m1();
        System.out.println("---");
        (new Sub()).m2();                // !!!!!!!!!!!!!!!!
    }
}

class Super {
    void m1() {
        System.out.println("Super!");
    }
}

class Sub extends Super {
    void m1() {
        super.m1();
        System.out.println("And Sub!");
    }

    void m2() {
        ((Super) this).m1();
    }
}

2 个答案:

答案 0 :(得分:10)

不,投射无效,因为它是用于选择m1来调用的对象的动态类型。

以下是诀窍:

    void m2() {
        super.m1();
    }

答案 1 :(得分:0)

这是一个很好的问题。根据{{​​3}},

  

super.name的处理方式与表达式完全相同   ((S)this).name

但这仅适用于类的字段,而不适用于方法(如JLS §15.11.2所述)。