黑马程序员技术交流社区

标题: 继承类与实现接口遇到的冲突 [打印本页]

作者: 刘晓康    时间: 2012-4-4 15:41
标题: 继承类与实现接口遇到的冲突
假如一个类实现两个接口,这两个接口中有一个同样的方法,会不会有冲突啊,怎么去实现?
假如Test类继承了一个类同时要实现一个接口,假如Test的父类中有一个叫public void fun(){}的方法,而接口中也有一个public void fun();的方法,那么Test里面重写:public void fun(){}方法,这是覆盖了父类的方法呢?还是实现了接口的方法?还是一举两得?
作者: 尹博    时间: 2012-4-4 16:21
多个接口具有相同的方法,调用的是任意一个接口的方法,因为他们本来就一样,不管多少个接口,方法都要实现,接口的方法都是一样的,那实现的代码也就是子类的方法。
如果超类和接口具有相同的方法,则调用的是接口的。因为接口的方法必须在该类中实现,实现后相当于子类覆盖了超类的方法。
作者: 张志阳    时间: 2012-4-4 16:22
抽象类中的方法只有子类继承才能实现,它自身并没有方法去实现,所以一个类实现两个接口没有冲突;test 里的public void fun(){}方法既覆盖了父类方法也实现了接口的方法。
作者: 李敏    时间: 2012-4-4 16:42
子类继承了父类的 非私有的run 方法,不管你是否有过覆写动作,在子类中都继承过来并存在这个run 方法。所以你再去实现一个接口,接口中的方法都是抽象的, 就算你 子类中没有 写明那个 run方法,因为存在,所以 那个run 方法也是覆写了接口中run 。并没有冲突。
有了run 方法就可以对父类和接口进行扩展。试想,难道还能两个 一模一样的 run ?
作者: 孙利川    时间: 2012-4-4 17:36
本帖最后由 孙利川 于 2012-4-4 17:38 编辑

接口只看方法,只要类定义时声明了实现接口,并且在类中实现了接口的所有方法,那么我们就认为该类实现了某接口。
为实现接口而写的方法当然也是类中的一个成员,如果父类中也有相同的方法,那么它自然也就覆盖了父类的方法。
所以答案是一举两得。
作者: 刘_浩    时间: 2012-4-4 19:26
在JAVA中是可以多实现的,不会有冲突的,因为只有方法名,没有方法体,复写了就可以了。复写一次相当于两个接口都被复写了。
第二个问题,既然父类中都有一个public void fun(){},你干嘛还要把接口中的public void fun();复写成public void fun(){},这不是多止一举吗?如果你两个都写成这个样子,既复写父类中的,也实现了接口中的。我执行过。你可以试试。不过多止一举,发现了这个问题,你很牛。
作者: 王硕'    时间: 2012-4-5 10:26
其实,老毕的视频说的很详细。
不管你的父类,还是接口中有多少个相同的方法,注意是相同的,即返回值,函数名,参数列表均相同的方法。
你在子类中实现或者说复写了这个方法,就等于实现上了所有的接口,同时复写了父类的方法。
java支持多继承,但只有接口可以多继承,这是因为接口没有方法体,你继承多少个相同函数,对于那个接口而言还是同一个没有方法体的函数。
但是类就不能多继承,如果可以的话,不同父类中有相同方法,而这些方法的功能不同,即方法体的内容不同。当你继承过来后,在调用时就不知道该调用哪一个。
但是有一种情况是不可以多实现的。比如一个接口中有一个方法: void show(); 另一个接口中还有一个方法: int show(); 这时就不能同时实现这个两个接口。理由很简单,就算一个类可以同时实现这两个接口,但当你创建对象调用show方法时,改返回哪一种类型的返回值? 这与重载正好相反,重载不关心返回值类型,只关心参数列表。
可能以上你都知道了,但也当做是自己对之前学习的理解吧。别嫌我话多。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2