A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马十八期0513 中级黑马   /  2013-3-28 00:35  /  2463 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 姜伟 于 2013-3-28 15:12 编辑

今天在论坛逛的时候发现了一个问题,之前没有注意到,今天我想了半天也没想到该如何解决。
我们都知道Java中不支持多继承但是可以多实现,多实现中可能会聘这样一个问题:
  1. public interface A{
  2.     public abstract void method();
  3. }
  4. public interface B{
  5.     public abstract int method();
  6. }
复制代码
如代码中所写,接口A与接口B都有一个method方法,只是返回值不同。类X在实现AB两个接口后,怎样复写它们同名不同返回值的method方法?
同样,还有一个问题:
class Fu{
        public void method(){}
}
interface C{
       public int method();
}
class Zi extends Fu,implements C{
    public ?  method(){
             ?
      }
}

这里method的返回值及方法体又该怎么来定义?

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢!  发表于 2013-3-28 08:19

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

10 个回复

倒序浏览
这样的问题是不允许存在的。不能同时继承。

既然两个接口返回值类型不一样,对象.method()出现后,该返回什么类型呢?电脑会疯掉的...下面那个继承和实现的问题 同样如此。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
续圆凯 发表于 2013-3-28 00:58
这样的问题是不允许存在的。不能同时继承。

既然两个接口返回值类型不一样,对象.method()出现后,该返回 ...

那要按照这样说的话,Java中岂不是不能多实现了?因为你在实现一个接口时,不可能知道接口中的全部抽象方法。你实现了A又实现了B,代码快写完了,才发现AB两个接口中存在这么一个方法,那程序员会疯掉的……
回复 使用道具 举报
现实中估计这种情况很少见的,这样的接口设计就不合理了,非要实现,通过内部类,public class C{ class Test1 implements A(){}  class Test2 implements B{}}
回复 使用道具 举报
姜伟 发表于 2013-3-28 01:10
那要按照这样说的话,Java中岂不是不能多实现了?因为你在实现一个接口时,不可能知道接口中的全部抽象方 ...

java 提供的接口是不会出现这种功能相同的问题的。  如果是自定义的话  应尽量避免同名方法。
回复 使用道具 举报
按照规则这是不允许的,一个类中允许方法重载,但是不允许出现参数列表相同而返回值不同的两个方法. 至于为啥,我也不知道,就这么规定的呗.java提供的接口应该不会出现这种问题,如果是自定义接口,那命名方法时就要小心了.
回复 使用道具 举报
首先说明,这样来实现具体方法肯定是不行,如果实现两个接口中有同名但不同返回值的方法,编译都通不过,其次就是原因了.
1.在java中的继承和实现的时候,实现两个接口的同名方法是没有意义的,自定义的也不行,禁止,这个是编码规范
2.举个现实例子说明下吧  java是oop思想,换成人类的想法就是,我有两个干爹,两个干爹都教你一门本事,都是钓鱼,一个说钓鱼要用蚯蚓(这个就是返回值)掉,一个说要用水草掉,假如你是第一次钓鱼,而且以前没有关于钓鱼的常识,那么你去钓鱼肯定就会在脑袋里面打架了,不知道用哪个方法去钓鱼,不知道该听谁的好....
于是乎你也报错了 哈哈...

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-3-28 07:21:30
8#
class Zi extends Fu,implements C
我补充一下你这里的问题:你的这句话有问题,Fu后面是不用加逗号的,只有在两个接口间才需要加逗号。
即使java是可以多实现的,但是什么都是需要有规则的,不能随意实现,如果这样,也会对程序的健壮性破坏的,所以,这种问题确实存在,但是我们应该尽量避免这种问题出现,将来你深入研究和学习了,你就自然明白这其中的原因了。
回复 使用道具 举报
李尧 发表于 2013-3-28 02:31
按照规则这是不允许的,一个类中允许方法重载,但是不允许出现参数列表相同而返回值不同的两个方法. 至于为啥 ...

一个类中不允许出现参数列表相同而返回值不同的两个方法,原因在于,如果一个类中出现了这样的两个方法,那么在调用这个对象的这个方法时,就无法确定返回值类型了。
  1. class Demo{
  2.      void method(){}
  3.      int method(){}
  4. }
  5. class Demo1{
  6.      new Demo().method();   //无法确定这个函数的返回值类型
  7. }
复制代码
回复 使用道具 举报
随风而去 发表于 2013-3-28 06:32
首先说明,这样来实现具体方法肯定是不行,如果实现两个接口中有同名但不同返回值的方法,编译都通不过,其次就 ...

如果这样说的话Java中就不能多实现了,因为这样做会有一个问题,你在实现一个接口的时候不可能知道它的全部抽象方法。X implements A,B在语法上没有问题,也符合Java中多实现的思想,不存在问题,但是AB接口可能都不是你写的,内容你也无法确定,而你又被要求同时继承AB两个接口。站在纯理论的角度来说,这样的情况是允许的,AB接口都被封装,你无法确定及更改其函数,X类又可以多实现,都是符合Java规则的。当然,我的说的这种情况开发中可能很少见,但是如果真碰上的话,应该还是可以想办法解决的。我再想想办法吧
回复 使用道具 举报
姜伟 发表于 2013-3-28 10:56
如果这样说的话Java中就不能多实现了,因为这样做会有一个问题,你在实现一个接口的时候不可能知道它的全 ...

在开发中,应该不会遇到这样的问题,你在使用别人定义的接口的时候,肯定先要去看这个接口的文档,不肯那个文档都不看就去使用,中到底都封装了什么方法,所以你肯定会知道这个些接口中是否出现了同名同参数方法,在文档中都会有注明,这也是为什么java会规定必须写文档注释的原因,目的就是要使用者知道我这封装好的类或包中到底是干什么用的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马