假设我们有以下课程,
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是什么?
答案 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)");}
}