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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈汉维 中级黑马   /  2012-7-29 14:11  /  4885 人查看  /  28 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈汉维 于 2012-7-29 14:20 编辑
  1. interface A
  2. {
  3.     public abstract int show();
  4. }
  5. interface B
  6. {
  7.     public abstract double show();
  8. }
  9. abstract class C
  10. {
  11.     public static final int NUM = 3;
  12.     public abstract void show();
  13. }

  14. class D extends C implements A,B
  15. {
  16. public void show()
  17. {

  18. }

  19. public int show()
  20. {
  21.     return 0;
  22. }

  23. public double show()
  24. {
  25.     return 1.1;
  26. }
  27. }
复制代码
老毕在接口那章有说到一个类既可以单继承也可以多现实,那以上这个就无法单继承多实现,大家怎么认为的?

这算不算是一种单继承多现实,或多实现,或单继承单实现局限性?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

28 个回复

倒序浏览
没太明白你的意思,但是既然你要继承
那你第17行是要重写,还是要重新定义一个函数,没看懂
回复 使用道具 举报
张振纲 发表于 2012-7-29 14:28
没太明白你的意思,但是既然你要继承
那你第17行是要重写,还是要重新定义一个函数,没看懂 ...

第17行是覆盖类C中的show方法。但是接口A和B中都有show方法,只是返回值类型都不一样,这样就无法单继承多实现,不是吗?
回复 使用道具 举报
这个程序有问题……

继承抽象类要实现类里的 抽象方法,实现接口 要实现接口定义的方法……
你这里 抽像类 接口定义的 方法都是 show(),
理论上D应该都实现,那么 D 里应该有 void show()  , int show() , double show()
但是这是不行地, 如果你掉一个show() 方法,程序知道去执行哪个吗?

方法的重载不是看返回值,而是看参数的 类型与个数……

回复 使用道具 举报
个人觉得应该算是一种局限性,,在被整合到同一个类中的不同接口或者类中使用相同的方法名,会造成代码的混乱,我们要做的是不是就是避免这种情况呢??
回复 使用道具 举报
应该改一下方法名字,继承抽象父类和实现多个接口,复写它们的抽象方法,但是复写之后就出现了多个方法相同的名字,但是还不符合重载的要求,方法名相同,但是参数个数,位置,类型都应该不同。所以你的程序必然出现错误。
回复 使用道具 举报
包晗 中级黑马 2012-7-29 14:38:09
7#
接口 能多继承
回复 使用道具 举报
陈汉维 发表于 2012-7-29 14:31
第17行是覆盖类C中的show方法。但是接口A和B中都有show方法,只是返回值类型都不一样,这样就无法单继承 ...

覆盖要求子父函数一致,返回值也必须一致
回复 使用道具 举报
我觉得你的思维里把重载和重写搞混了
回复 使用道具 举报
丁二跃 发表于 2012-7-29 14:32
这个程序有问题……

继承抽象类要实现类里的 抽象方法,实现接口 要实现接口定义的方法……

所以说,假设在进行二次开发,不能修改源代码,一般都是用继承或者实现的把?如果继承一个类,然后再实现一个接口。可是被继承的类和接口里面有同名的方法,返回值却不相同,那怎么办呢?那就只能继承该类,或者只能实现该接口,不是吗?
回复 使用道具 举报
聂峰 发表于 2012-7-29 14:34
应该改一下方法名字,继承抽象父类和实现多个接口,复写它们的抽象方法,但是复写之后就出现了多个方法相同 ...

所以说这样就无法单继承多实现,而且如果A接口中的方法是show1(),B接口中的方法是show2(),那多实现没问题吧,可是如果A和B接口中的方法名字都相同,但是返回值都不同,那不是无法多现实了啊。- -!汗
回复 使用道具 举报
张振纲 发表于 2012-7-29 14:43
我觉得你的思维里把重载和重写搞混了

好吧,我里面用的全都是覆盖,我可没用到重载。汗颜
回复 使用道具 举报
包晗 发表于 2012-7-29 14:38
接口 能多继承

interface A
{
    public abstract int run();
}
interface B
{
  public abstract double run();
}
class Test implements A,B
{
  
}
那如果是这种情况,可以多实现吗?- -!
回复 使用道具 举报
纪艺松 发表于 2012-7-29 14:34
个人觉得应该算是一种局限性,,在被整合到同一个类中的不同接口或者类中使用相同的方法名,会造成代码的混 ...

我也觉得写代码应该避免这种情况,如果出现这种情况,就无法多实现了不是吗。。。
回复 使用道具 举报
陈汉维 发表于 2012-7-29 15:06
我也觉得写代码应该避免这种情况,如果出现这种情况,就无法多实现了不是吗。。。 ...

我觉得这不是无法实现的问题,而是在一个类中不允许出现相同参数的同名方法。。不管是继承还是实现,这些方法都将被该类拥有。。不知道我说的对不对;
回复 使用道具 举报
纪艺松 发表于 2012-7-29 15:10
我觉得这不是无法实现的问题,而是在一个类中不允许出现相同参数的同名方法。。不管是继承还是实现,这些 ...

是的,一个类中不能出现同名的方法。所以这是一种例外不是吗?
回复 使用道具 举报
OOP思想之继承。个人总结。
        (1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
  (2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
  (3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
  (4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
  (5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。
        简而言之,父类有的子类必有,且子类还能有自己的属性和方法。


根据你所闻到的问题,能否参看第五条呢?
回复 使用道具 举报
刘同超 发表于 2012-7-29 15:28
OOP思想之继承。个人总结。
        (1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那 ...

多重继承是:
class A
{
  void show(){...}
}
class B extends A
{
  void show(){...}//A的show被覆盖了
}
class C extends B
{
  void show(){...}//B的show被覆盖了
}
- -!这个是多重继承。貌似和多现实是两码事
多实现是
interface A{void show();}
interface B{void show();}
class C implements A,B
{

}
回复 使用道具 举报
不会觉得多余???或是层次不对吗?
你去继承多个接口,接口中有相同的方法,是没有问题的。
但是你继承的类里面居然还有这个方法,那继承这些接口是否多余???
还是说层次错误了。
回复 使用道具 举报
王渠 发表于 2012-7-29 16:01
不会觉得多余???或是层次不对吗?
你去继承多个接口,接口中有相同的方法,是没有问题的。
但是你继承的 ...

interface A
{
  public abstract void show();
}
interface B
{
  public abstract int show();
}
class C implements A,B
{

}
这种情况是不是不能多实现?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马