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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-9 16:59  /  1509 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 全海波 于 2012-8-4 09:49 编辑
  1. class  InterfaceTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 D d = new D();
  6.         }
  7. }
  8. interface A
  9. {
  10.         void methodA();
  11.         int show();
  12. }
  13. interface B
  14. {
  15.         void methodB();
  16.         boolean show();
  17. }
  18. interface C extends B,A
  19. {
  20.         void methodC();
  21. }
  22. class D implements C
  23. {
  24.         public void methodA(){}
  25.         public void methodB(){}
  26.         public void methodC(){}
  27.         public int show(){}
  28.         public boolean show(){}
  29. }
复制代码
为什么会编译出错呢?

6 个回复

正序浏览
嗯嗯,是呀!
回复 使用道具 举报
本帖最后由 黄丽慧 于 2012-7-9 19:55 编辑

楼主,我把你的代码放到eclipse上去调试,知道哪里报错了。
class  InterfaceTest
{
        public static void main(String[] args)
        {
                D d = new D();
        }
}
interface A
{
        void methodA();
        int show();//我这里改成int show(int a);,就可以了,楼主可以动手试试看
}
interface B
{
        void methodB();
        boolean show();//我这里改成boolean show(String s);,就可以了,楼主可以动手试试看
}
interface C extends B,A//接口是可以多继承的,这个地方报错的错误是:返回类型不兼容。你看看接口B和接口A里面都有一个show方法,而且只有返回值不同,等到调用的时候JVM就不知道到底该调用哪一个了。如果你想实现重载的话,就应该传入不一样的参数
{
        void methodC();
}
class D implements C
{
        public void methodA(){}
        public void methodB(){}
        public void methodC(){}
        public int show(){}       //这两个show方法而且只有返回值不同,等到调用的时候JVM就不知道到底该调用哪一个了。另外只有不是void型的,都应该用return来返回函数值。
        public boolean show(){}//如果你想实现重载的话,就应该传入不一样的参数。我把这两个地方改了一下,   
    public int show(int a ){return a;}          public boolean show(String b){return false;}     这样就不会报错了,楼主可以试试哦

}

点评

还有想给你加分的冲动  发表于 2012-7-9 22:29

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
哈哈,楼主是故意的
毕老师的视频中讲到接口的多继承时特地说过这个情况
在被继承的多个接口中不能出现返回值类型不同的同名抽象方法
因为中间会出现最终子接口的重载问题,和实现类的覆盖问题
在你的c接口中出现了两个同名不同类型的方法,不能算重载,这是不能同时存在的
所以实现类就不存在复写他可能,即使像你在实现类里分别复写了他们
但是在实现类里,覆盖后的这俩方法仍然是不能算重载
回复 使用道具 举报
本帖最后由 贾存双 于 2012-7-10 03:33 编辑

因为 int show() 和 boolean show() 都是抽象方法,并不是覆写,他们都是无参方法,也不算方法的重载,所以实例化后不知道要返回哪一个。
回复 使用道具 举报
本帖最后由 万宝东 于 2012-7-9 17:22 编辑

因为A 接口和B接口的show()方法的返回值不一样,所以当C接口继承A和B 时就会出错。
还有就是你的代码的27 28 两行,你的这种写法不能实现重载,这种叫方法重名。
虽然重载不考虑返回值,但是你的两个方法都是空参数的,不能构成重载,只能叫重名。
不知这么解释,楼主清楚吗
回复 使用道具 举报
本帖最后由 曹恒业 于 2012-7-9 17:14 编辑
  1. class  InterfaceTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 D d = new D();
  6.         }
  7. }
  8. interface A
  9. {
  10.         void methodA();
  11.         int show();
  12. }
  13. interface B
  14. {
  15.         void methodB();
  16.         boolean show();
  17. }
  18. interface C extends B,A
  19. {
  20.         void methodC();
  21. }
  22. class D implements C
  23. {
  24.         public void methodA(){}
  25.         public void methodB(){}
  26.         public void methodC(){}
  27.         public int show(){}     //同名函数返回值不同,你让JVM返回哪个呢?当然编译不通过了。。
  28.         public boolean show(){}   //同名函数返回值不同,你让JVM返回哪个呢?当然编译不通过了。。
  29. }//关于函数的重载,需要函数的参数列表不同,参数列表包括参数类型和参数个数,函数重载的条件不包括返回值类型不同。
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马