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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵彩华 中级黑马   /  2013-3-30 23:55  /  1451 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵彩华 于 2013-4-1 19:01 编辑

当一个类同时实现两个接口A和B,即形如class C implements A,B { },如果接口A和B之中有相同的方法,参数也相同,但返回值类型不同,问在class C中该如何实现?

点评

呵呵,假设太多不成立。。。。。。。。  发表于 2013-3-31 12:36

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

10 个回复

倒序浏览
新手,学习了,正好看到这了,也有此困惑,求解
回复 使用道具 举报
“interface”(接口)关键字使抽象的概念更深入了一层。我们可将其想象为一个“纯”抽象类。它允许创
建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数
据类型的数据成员,但它们都默认为static 和final。接口只提供一种形式,并不提供实施的细节。
接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在这个样子”。因此,采用了一个特定接
口的所有代码都知道对于那个接口可能会调用什么方法。这便是接口的全部含义。所以我们常把接口用于建
立类和类之间的一个“协议”。有些面向对象的程序设计语言采用了一个名为“protocol”(协议)的关键
字,它做的便是与接口相同的事情。
为创建一个接口,请使用interface 关键字,而不要用 class。与类相似,我们可在 interface关键字的前
面增加一个 public关键字(但只有接口定义于同名的一个文件内);或者将其省略,营造一种“友好的”状
态。
为了生成与一个特定的接口(或一组接口)相符的类,要使用 implements(实现)关键字。我们要表达的意
思是“接口看起来就象那个样子,这儿是它具体的工作细节”。除这些之外,我们其他的工作都与继承极为
相似。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
按照java的基础语法分析的话,应该是没有提供能实现的关键字什么的;
回复 使用道具 举报
interface A
{
        public void aaa();
}

interface B
{
        public void bbb();
}

class C implements A,B
{
        public void aaa(){
                System.out.println("aaa");
        }
        public void bbb(){
                System.out.println("bbb");
        }
}

一样的。
回复 使用道具 举报
interface A
{
        public void aaa();
}

interface B
{
        public String bbb();
}

class C implements A,B
{
        public void aaa(){
                System.out.println("aaa");
        }
        public String bbb(){
                //System.out.println("bbb");
                return("bbb");
        }
}

点评

你给出的两个接口中的方法名不同。我说的事相同的方法名。  发表于 2013-3-31 13:00

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

回复 使用道具 举报
xyh19 高级黑马 2013-3-31 10:10:38
7#
在不同接口中使用相同的方法名通常会造成代码可读性的混乱,应该尽量避免这种情况。这也是编程人员需要注意的东西。
别想着怎么弄好方法这样实现,即便实现了电脑可以区别了,给别人带来将是不便,
咱们学习各种技术的目的是为了更简洁、更方便的用于实际,而不是给其他程序员带来麻烦,这样就违背了技术的本质了。

点评

恩恩 建议不错,应尽量避免同时继承有相同参数的方法的不同接口。谢谢!  发表于 2013-3-31 12:58

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
interface A
{
        String add();
}

interface B
{
        int add();
}

class C implements A,B
{

       
        public String add() {}
               
        public int add(){}
       
       
}
你的意思是这样吧,这样是行不通的,同时继承的两个接口中的方法是不可以方法名相同而返回值不同,这是错误的

点评

呵呵 正因为如此,才有上面的疑问的  发表于 2013-3-31 12:57

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 米腾达 于 2013-3-31 10:32 编辑

同一个类中,若是方法名相同,只有重载这种情况,但是方法重载要求方法的参数列表不同。像你说的这种情况下,如果像下面这样写一定不能通过编译通过
  1. interface InterA
  2. {
  3.         public int show();
  4. }

  5. interface InterB
  6. {
  7.         public String show();
  8. }

  9. class C implements InterA,InterB
  10. {
  11.         public int show(){
  12.                 return 1;
  13.         }
  14.         public String show(){
  15.                 return "InterB";
  16.         }
  17. }
复制代码
若是一定要实现两个接口中的同名方法的话,可以用下面的方法


  1. interface InterA
  2. {
  3.         int show();
  4. }

  5. interface InterB
  6. {
  7.         String show();
  8. }

  9. class C implements InterA
  10. {
  11.         private InterB bb = new InterB(){
  12.             public String show(){
  13.                 return "InterB";
  14.             }
  15.          };
  16.         public int show(){
  17.                return 1;
  18.         }
  19.        public InterB getInterB(){
  20.             return bb;
  21.        }
  22. public static void main(String[] args){
  23.     C cc = new C();
  24.     System.out.println(cc.show());
  25.     System.out.println(cc.getInterB().show());
  26. }
  27. }
复制代码

点评

你理解了我的题意,回答的很好!只是下面的解决方法我还没有弄明白,待我研究下下哈/微笑  发表于 2013-3-31 12:56

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这个问题我发过一次帖
请参考。希望给你一定的启发。
肖明凯 提出的用内部类的方案是比较不错的。

http://bbs.itheima.com/forum.php ... mp;page=1#pid241818

祝共同进步!!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问;没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马