日期:2014-05-20  浏览次数:20803 次

继承与接口问题
Java code

interface I1 {
    int f1();
}
class C {
    public int f1() {
        return 1;
    }
}
class X extends C implements I1 {
    public int f1() {
        return 1;
    }
}


X继承了C并且实现了I1接口,C和I1有相同名字的方法,我想问下,X里的方法是继承C的还是实现I1的?

------解决方案--------------------
应该是既继承又实现了吧,但是你接口里面的方法是缺省的。不知道和这个有没有关系。你自己测试下
------解决方案--------------------
接口中的方法被实现的同时他会覆盖父类同名的方法,因此可以肯定它是实现I1的.C中的方法被覆盖了..
------解决方案--------------------
写点代码方法测试下赛
------解决方案--------------------
一楼说的对 既实现了接口里的方法,又重载了父类的方法,重载是巧合而已。

首先 implements I1 所以 class X 必须实现f1()方法。

其次 class C 里的f1() 方法是public的,和class X 的f1() 方法,返回值相同,参数列表也相同,
这只能说是一种巧合,根据多态,class X重写了class C的f1()方法。

最后如果 class C 里的f1() 方法是private的,那么class C 里的f1()方法就不会被 class X 所继承,因此就没有重载,只是实现。
------解决方案--------------------
你可以把接口当成光杆抽象类理解

你这层关系,应该这么来说

X继承了C,并重写了int fi()方法

而C中的int f1()方法继承自接口I1

也就是说 
X x=new X();
C c=new X();
I1 i=new X();
都是正确的,都是父类的引用指向子类的对象

这里的
x.f1() c.f1() i.f1() 调用的方法都是 X实例中的f1();

do you understand?
------解决方案--------------------
接口的方法本身就必须要实现,【继承C的还是实现I1】两者又不矛盾,只是刚好巧合在一起了,你纠结个啥啊。
就好像一个人上了大学,叫他大学生可以吧。然后他姓大,名叫大学生,难道不行吗?
楼主,当心被人耻笑智商啊,呵呵。
------解决方案--------------------
是实现,继承被覆盖了
------解决方案--------------------
探讨
这个我确实试了,没有实现接口的方法,代码没有报错,但是只有这种情况下才可以不实现接口的方法吗?没有别的情况了吗?

------解决方案--------------------
为何要强调是“巧合”???? 难道有意为之不更合理么?

一个接口只要求实现它规定的方法就行了,你管她是继承来的,还是自身定义的。

子类本身没有必要重写父类的方法时非要重复实现一遍不是很难受的事情么。。。