以下Java片段是否正确?

时间:2014-09-05 11:40:08

标签: java oop inheritance

以下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

3 个答案:

答案 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。