以下Java片段是否正确?在肯定的情况下,方法fie
被重新定义(覆盖)?什么印刷?
class A {
int x = 4;
int fie (A p) { return p.x;}
}
class B extends A {
int y = 6;
int fie (B p) { return p.x + p.y;}
}
B b = new B();
A a = new A();
int zz = a.fie(a) +b.fie(a); //here,b.fie(a)---how is this working?
System.out.println(zz);
请帮我回答这个问题。我正在进行OOP继承,但我仍然不明白为什么b.fie(a)
没问题。我在Eclipse上测试了它,它运行正常。打印出14.我想这里没有被覆盖。但是,当传入的参数为fie(B p) {...}
(类型A)时,B类中的方法p.y
如何访问ac
?
答案 0 :(得分:0)
由于两种方法具有不同的参数,因此不会覆盖该方法。因此,方法会过载。
b.fie(a)
将调用类A
中定义的方法
a.fie(b)
也会调用类A
中定义的方法
b.fie(b)
将调用类B
中定义的方法,现在可以访问y。
A c = new B();
c.fie(b);
也会调用类A
中定义的方法(这是因为fie重载并且没有被覆盖!)
答案 1 :(得分:0)
在B类中,您不会覆盖fie方法,而是重载它。它使用不同的方法签名。所以B级有2种方法。一个接受A类,一个接受B类。
答案 2 :(得分:0)
我希望打印8,而不是14。
B扩展A,并继承int fie(A p)。 此外,B定义了int fie(B p)
这两种方法不会发生碰撞,因为它们是不同的方法。两者都具有相同的名称,但签名不同(一个接受A,另一个接受B作为参数)。这是方法重载NOT覆盖的示例。
因此,当你调用b.fie(a)时,作为A类型,它调用从A继承的方法(B有另一个具有相同名称的方法,但它是一个不同的方法,因为签名是不同的)。
因此,a.fie(a)+ b.fie(a)将调用A定义的方法的两倍,并且它将添加4 + 4。