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

© 陈汉维 中级黑马   /  2012-7-29 14:11  /  5449 人查看  /  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 个回复

正序浏览
陈汉维 发表于 2012-7-29 22:16
哈哈,没有,你没经历过大家合作一起做一个项目,一起争执的场景吗?同样的道理。欧了。
还有,老毕第8天 ...

好了,哦了,我看看
回复 使用道具 举报
吴立杰 发表于 2012-7-29 22:11
我的言语刺激你了?

哈哈,没有,你没经历过大家合作一起做一个项目,一起争执的场景吗?同样的道理。欧了。
还有,老毕第8天和第9天的继承和实现可以多看看,看了你就明白我说的这个问题和单继承多实现有木有关系了。另外,这个问题出处:老毕新版(35天)第9天第11个视频(多实现)。
回复 使用道具 举报
陈汉维 发表于 2012-7-29 21:43
我要的不是分,即使分拿到了,去了黑马不是也在听天书?而且13期距离现在还1个月多10天,我有必要花心思 ...

:(我的言语刺激你了?
回复 使用道具 举报
吴立杰 发表于 2012-7-29 21:27
哈哈,楼主有意思啊,这个跟单继承和多实现没关系咯,很明显啊,在第15行,class D extends C implements A ...

我要的不是分,即使分拿到了,去了黑马不是也在听天书?而且13期距离现在还1个月多10天,我有必要花心思来骗分?还有,这个问题我也在CSND论坛也发过贴,只是现在大家都在看老毕的视频,所以才来给大家一个建议而已,不是吗?
再而,你们看的视频估计是老毕旧版的视频,老毕的旧版视频没讲到这个,但是老毕新版的视频讲到这个了。只是贴出来让大家看看而已,有多少人注意到了?请问这和我思维牛叉有关系吗?
interface A
{
  public abstract void add();
}
interface B
{
  public abstract int add();
}
class C implements A,B
{
  
}
请问这种情况你多实现?既然不能,那不就是一个例外?
有关于这个例子的出处,请查看传智播客官网,老毕最新版的视频(35天),第9天,第11(多实现)。谢谢,再而,你也很牛叉。
回复 使用道具 举报
哈哈,楼主有意思啊,这个跟单继承和多实现没关系咯,很明显啊,在第15行,class D extends C implements A,B这个类里面由于重写了三个同名同参的方法,导致这个类出问题了,这个在开发中是不会遇到的吧,楼主差点把我弄懵了,还好看出来了,楼主改下方法名,你的代码思路没错,错在重写后的方法无法重载了,哦了,这个问题应该给你分吧,楼主的思维角度很牛叉啊。
回复 使用道具 举报
徐帅 发表于 2012-7-29 17:09
个人觉得是这样的,因为接口的目的就是定义了一个规则,接口是扩展的功能,在java中原本是以多实现来降低了 ...

非常感谢你的回答,确实是对接口理解不深刻。而且在以后写代码的时候定义方法名肯定要有意义的,所以我说的这种情况应该几乎不会出现。嘿,我举得这个例子只是非常特殊的情况,不是吗?
再次感谢,大家共勉,互相加油。:handshake
回复 使用道具 举报
个人觉得是这样的,因为接口的目的就是定义了一个规则,接口是扩展的功能,在java中原本是以多实现来降低了多继承带来的隐患,就是当子类继承多个父类时,因为有共同的方法而不知道执行哪一个,楼主的问题,虽然用了多实现,却出现了同样的问题,原因就是对接口的理解不够深刻,定义时就出现了错误,既然接口是扩展的功能,而且对外提供了规则,那么它就应该有扩展性,在楼主的程序中毫无扩展性可言,都是特有方法,当其它类后期实现时不可能全部都会返回相同的类型,应该直接抽取共性的部分,定义为  public void show(),而且参数也没有区别,所以你又无法通过参数的类型来告诉虚拟机来执行哪个。这样的问题应该不是局限性吧,不过弄懂接口的定义我想这样的问题也不会出现了吧,
只是个人观点。希望对楼主有帮助。
回复 使用道具 举报
王渠 发表于 2012-7-29 16:12
两个接口中的方法返回值是不一样的对吧,如果两个接口在做的是同一件事情。那就不需要两个接口,如果是不确 ...

是的,所以说java有多实现,但是有些情况是用不了的不是吗
回复 使用道具 举报
两个接口中的方法返回值是不一样的对吧,如果两个接口在做的是同一件事情。那就不需要两个接口,如果是不确定返回值。那是否可以用泛型???
或者直接返回值是Object类型,只要你在自己使用的时候把握好就ok?
回复 使用道具 举报
王渠 发表于 2012-7-29 16:01
不会觉得多余???或是层次不对吗?
你去继承多个接口,接口中有相同的方法,是没有问题的。
但是你继承的 ...

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

}
这种情况是不是不能多实现?
回复 使用道具 举报
不会觉得多余???或是层次不对吗?
你去继承多个接口,接口中有相同的方法,是没有问题的。
但是你继承的类里面居然还有这个方法,那继承这些接口是否多余???
还是说层次错误了。
回复 使用道具 举报
刘同超 发表于 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
{

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


根据你所闻到的问题,能否参看第五条呢?
回复 使用道具 举报
纪艺松 发表于 2012-7-29 15:10
我觉得这不是无法实现的问题,而是在一个类中不允许出现相同参数的同名方法。。不管是继承还是实现,这些 ...

是的,一个类中不能出现同名的方法。所以这是一种例外不是吗?
回复 使用道具 举报
陈汉维 发表于 2012-7-29 15:06
我也觉得写代码应该避免这种情况,如果出现这种情况,就无法多实现了不是吗。。。 ...

我觉得这不是无法实现的问题,而是在一个类中不允许出现相同参数的同名方法。。不管是继承还是实现,这些方法都将被该类拥有。。不知道我说的对不对;
回复 使用道具 举报
纪艺松 发表于 2012-7-29 14:34
个人觉得应该算是一种局限性,,在被整合到同一个类中的不同接口或者类中使用相同的方法名,会造成代码的混 ...

我也觉得写代码应该避免这种情况,如果出现这种情况,就无法多实现了不是吗。。。
回复 使用道具 举报
包晗 发表于 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:43
我觉得你的思维里把重载和重写搞混了

好吧,我里面用的全都是覆盖,我可没用到重载。汗颜
回复 使用道具 举报
聂峰 发表于 2012-7-29 14:34
应该改一下方法名字,继承抽象父类和实现多个接口,复写它们的抽象方法,但是复写之后就出现了多个方法相同 ...

所以说这样就无法单继承多实现,而且如果A接口中的方法是show1(),B接口中的方法是show2(),那多实现没问题吧,可是如果A和B接口中的方法名字都相同,但是返回值都不同,那不是无法多现实了啊。- -!汗
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马