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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董霁辉 中级黑马   /  2013-4-1 16:17  /  2075 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董霁辉 于 2013-4-1 18:39 编辑

interface A{
    void methodA();
    int show();
}
interfaceB{
       void methodB();
    boolean show();
}
interface C extends B,A{
    void methodC();
}
class D implements C
{
   public void methodC(){};
   public void methodC(){};
   public int show(){};
   public boolean show(){};
}
毕老师说绝对不能像上面那么定义class D,理由不确定返回值.
问题:如果在show方法中参数列表不同,重载show方法的话,可以吗?

评分

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

查看全部评分

9 个回复

倒序浏览
重载和重写是不同的哦,如果在父类中仅是参数列表不同,那么就是重载了,而在子类中是重写,但是重写有需要返回值与父类一致,此处的show不能确定返回值,一个是int,一个是boolean,这样定义不科学。即使在父类中重载了show方法,返回值还是不确定,所以楼主就不要这要定义啦~~

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 董霁辉 于 2013-4-1 16:59 编辑
赵海洋 发表于 2013-4-1 16:36
重载和重写是不同的哦,如果在父类中仅是参数列表不同,那么就是重载了,而在子类中是重写,但是重写有需要 ...

你的意思是说子类不能重载父类方法,是吗? 如果不能,烦请帮忙解释下哈
回复 使用道具 举报
本帖最后由 袁梦希 于 2013-4-1 18:09 编辑

楼主的代码好像有问题,怎么定义了两个interface A呢  第五行应该是interface B

重载的定义是:在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了。
如何区分重载:当函数同名时,只看参数列表。和返回值类型没关系。如果重载了以后还是不能确定返回值类型的


评分

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

查看全部评分

回复 使用道具 举报
董霁辉 发表于 2013-4-1 16:50
你的意思是说子类不能重载父类方法,是吗? 如果不能,烦请帮忙解释下哈

关于这个,其实蛮纠结的。我查过资料,不过最后有人跟我说,这是英语翻译问题,别费时间了。然后有这样一种说法,重载有两种含义,一种就是重载,一种就是重写,为什么?还是因为这是英语翻译过来的。。。是不是很纠结??哈哈。其实吧,我们看看重载的定义,可以得知重载,是在同一个类中,方法名相同,参数列表不同,与返回值无关。所以只有子类重写父类的方法,没有子类重载父类,在java中没有子类重载父类方法的概念。相信如果你要去查资料,问别人,也会很纠结。。。。
回复 使用道具 举报
重载和重写有明显的区别:
重载,是方法的多态性的体现,要点是方法必须在同一个类中,才有重载可言,且只有返回值类型不同不能构成重载。适用场景:构造函数(即重载构造函数的话就是以不同的初始化方式初始对象)
重写,也是方法的多态性的体现,但是是针对父子类而言的,没有父类中的方法定义,子类不可能有重写,同一个类之中,更不可能有重写之说。再一个,重写要求除了方法体以外的部分,其他的跟父类中的方法必须全部相同
再看你的代码:
第二个接口是接口B吧?问问题的时候,注意自己代码的正确性
你的接口C在编译的时候就会直接报错,因为你继承的两个接口中有同名但是返回值不同的方法,无法确定返回值类型
show()方法当然可以重载,即使你已经重写了,那是针对父子类而言的,重载是针对你类中已经存在的show()方法而言的,不冲突,
代码如下:(为了简单表示,把你的出错部分已经去掉了)
  1. abstract class A {
  2.         abstract int show();
  3. }

  4. class D extends A {
  5.        
  6.         /**
  7.          * 重写父类中的抽象方法
  8.          */
  9.         public int show() {
  10.                 return 0;
  11.         };
  12.        
  13.         /**
  14.          * 重载本类中的show()方法
  15.          */
  16.         public int show(String a) {
  17.                 return 0;
  18.         }
  19. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 刘焕新 于 2013-4-1 18:01 编辑

如果在show方法中参数列表不同,重载show方法的话,是可以的。
请看示例代码:
  1. interface A {
  2.         void methodA();
  3.         void methodC();
  4.         boolean show();
  5. }

  6. interface B {
  7.         void methodA();
  8.         //下面两个show()方法构成重载(多态),实现此接口的类需要同时实现这两个方法。
  9.         int show(int i);
  10.         boolean show();  
  11. }

  12. interface C extends A, B {
  13.         void methodA();
  14.         int show(int i);
  15.         
  16.         /* 子类继承的所有接口中,如果有同名同参的方法,那么这些同名同参的方法的返回值必须一样。
  17.          这样的情况下,子类再覆盖父类同名同参方法时,只需重写一个同名同参的方法即可。下面就是:*/
  18.         boolean show();
  19. }

  20. class D implements C {
  21.         //Override :在抽象类与子类的继承关系中,它叫重写(或覆盖);
  22.         //在接口和它的实现类里,叫实现;叫法不一样,其实是同一种行为和结果。
  23.         @Override
  24.         public void methodA() {        
  25.                 //A和C接口的抽象方法的具体实现
  26.         }
  27.         
  28.         @Override
  29.         public void methodC() {
  30.                 //A接口的抽象方法的具体实现
  31.         }

  32.         @Override
  33.         public boolean show() {
  34.                 //A和B接口的抽象方法的具体实现
  35.                 return false;
  36.         }
  37.         
  38.         @Override
  39.         public int show(int i) {
  40.                 //B接口的抽象方法的具体实现
  41.                 return 0;
  42.         }
  43. }
复制代码
总之,我的理解就是:接口是个类,而且还是个抽象类,而且还是个特殊的抽象类。也就是说,接口也是抽象的概念。

评分

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

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问; 没问题请将帖子分类改成【已解决】~
回复 使用道具 举报
袁梦希 发表于 2013-4-1 17:05
楼主的代码好像有问题,怎么定义了两个interface A呢  第五行应该是interface B

重载的定义是:在一个类中 ...

给力 太感谢了
回复 使用道具 举报
感谢大家 讲解{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马