java这个关键字在多态中

时间:2018-04-05 00:35:55

标签: java

enter image description here

假设我们有以下课程,

public class poly{
static class A{
    void f(C c){System.out.println("A.f(C)");c.f(this); c.g(this);}
    static void g(){System.out.println("A.g()");}
}

static class B extends A{
    void f(D d){System.out.println("B.f(D)");d.f(this);
        ((C)d).g(this);}
    void f(C c) {System.out.println("B.f(C)");c.f(this); c.g(this);}
    static void g(){System.out.println("B.g()");}
}

static class C{
    void f(A a){System.out.println("C.f(A)");}
    static void g(A a){System.out.println("C.g(A)");}
    static void g(B b){System.out.println("C.g(B)");}
}

static class D extends C{
    void f(A a){System.out.println("D.f(A)"); }
    void f(B b){System.out.println("D.f(B)"); }
    static void g(A a){System.out.println("D.g(A)");}
    static void g(B b){System.out.println("D.g(B)");}
}

和主要课程:

public static void main(String[] args){
    A a = new A();
    B b = new B();
    C c = new C();
    D d = new D();


    a.f(d);
    a.g();
    a = b;
    c = d;
    a.f(c);
    a.f(d);
    b.f(c);
    }
}

我不明白为什么我打电话给a.f(c) 结果会产生     D.f(A)

完整答案是:     B.f(C)     D.f(A)     C.g(B)

为什么c.f(this)中的“this”对象是对象A,而c.g(this)中的对象B是什么?

1 个答案:

答案 0 :(得分:0)

如图所示,您已将变量“c”定义为“C”类(C类)。因此,java不可能知道静态代码分析的扩展类。类“C”中只有“f”的1个签名,它只接受类型“A”作为参数。由于类“B”扩展为“A”,你不会得到编译错误,但你会调用类“C”的方法“f”,因为你没有严格定义“f”也接受“B” 。因此,您不能覆盖子类中的任何方法,并且java将始终调用超类。

public class poly{
static class A{
    void f(C c){System.out.println("A.f(C)");c.f(this); c.g(this);}
    static void g(){System.out.println("A.g()");}
}

static class B extends A{
    void f(D d){System.out.println("B.f(D)");d.f(this);
        ((C)d).g(this);}
    void f(C c) {
        System.out.println("B.f(C)");
        c.f(this); <--- variable 'c' is of class "C" and has only 1 "f" function that takes in "A" (which B extends, so no compile error)
        c.g(this); <--- variable 'c' is of class "C", but both "C" and "D" have "f(B b)" defined, so use subclass "D's" method
}
    static void g(){System.out.println("B.g()");}
}

static class C{
    void f(A a){System.out.println("C.f(A)");} <--- I'm the only "f" here!
    static void g(A a){System.out.println("C.g(A)");}
    static void g(B b){System.out.println("C.g(B)");}
}

static class D extends C{
    void f(A a){System.out.println("D.f(A)"); }
    void f(B b){System.out.println("D.f(B)"); }
    static void g(A a){System.out.println("D.g(A)");}
    static void g(B b){System.out.println("D.g(B)");}
}