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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sunsteam 中级黑马   /  2015-8-20 21:29  /  3466 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
本帖最后由 sunsteam 于 2015-8-21 23:16 编辑

首先是看到有下面这个题, 所以自己写了代码实现了下  关于抽象类实现接口有点疑问.


接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?(演讲内容,面试题)


1. 我的理解 接口如果要实现 必须是子类完全重写接口的所有抽象方法,  但是DemoD没有做重写实现的情况下(我注释掉了) 编译运行也通过了 为什么

2. 抽象类在具体重写了2个接口的抽象函数的情况下,  里面又包含主函数.  主函数是静态的, 不能访问同类下的非静态方法, 同时由于abstract和static2个关键词冲突  重写了也没法调用

3. 假设抽象类不包含主函数,  它本身也不能建立对象, 那么就不能用来调用接口的功能  综合2和3  抽象类继承接口是否一点意义也没有?  



  1. interface DemoA
  2. {
  3.         void aDemo();
  4. }

  5. interface DemoB extends DemoA
  6. {
  7.         void bDemo();
  8. }

  9. class DemoC
  10. {
  11.         void cDemo()
  12.         {
  13.                 System.out.println("cDemo run");
  14.         }
  15. }

  16. abstract class DemoD extends DemoC implements DemoB
  17. {
  18.         abstract void dDemo();
  19. /*
  20.         public void bDemo()
  21.         {        
  22.                 aDemo();
  23.                 System.out.println("bDemo run");
  24.         }
  25.         public void aDemo()
  26.         {
  27.                 System.out.println("aDemo run");
  28.         }
  29. */
  30.         public static void main(String[] args)
  31.         {
  32.                 System.out.println("Main run");
  33.                 new DemoC().cDemo();
  34.                 //bDemo();
  35.                 //aDemo();
  36.         }
  37. }
复制代码




最佳答案

查看完整内容

首先,这几个问题答案都是可以。 针对你的三个疑问 1.抽象类不用全部实现接口中的所有方法,其余的方法实现可以交给该抽象类的子类去实现即可。 比如你给的示例代码,如果让DemoC实现接口DemoA,但是重写接口方法时,会有提示:如下图 可以看到,它提供了两个办法解决,其中第二就是把DemoC变成一个抽象类。 所以抽象类是可以实现接口的。 2.这个不知道有什么意义,抽象类是不完整的类,但是也可以有非抽象函数的,main函数也 ...

7 个回复

倒序浏览
首先,这几个问题答案都是可以。
针对你的三个疑问
1.抽象类不用全部实现接口中的所有方法,其余的方法实现可以交给该抽象类的子类去实现即可。
   比如你给的示例代码,如果让DemoC实现接口DemoA,但是重写接口方法时,会有提示:如下图

可以看到,它提供了两个办法解决,其中第二就是把DemoC变成一个抽象类。
所以抽象类是可以实现接口的。
2.这个不知道有什么意义,抽象类是不完整的类,但是也可以有非抽象函数的,main函数也是函数当然可以有。
3.接口只能实现,不能继承。所以正确的说法应该是抽象类实现接口。
  这么做不是没有意义,恰恰相反,有很大用处。就是用了第一点中说的特点,抽象类不用全部实现接口中所有方法,这样当你需要一个接口中一部分方法时,可以先让一个抽象类去   实现这个接口中的部分方法,然后你再继承抽象类,就可以获得接口的部分方法。你看看Java源码中很多类都是这种体系结构。
不知道理解的对不对,欢迎指正。

点评

回答得很详细,第三点我是从多态的方向理解的  发表于 2015-8-21 13:33
回复 使用道具 举报
接口可以继承接口。
抽象类不是具体类,不可可实现(implements)接口。
抽象类不可继承具体类(concrete class)。
抽象类中可以有静态方法,但是不能有main方法。
回复 使用道具 举报
史柯 发表于 2015-8-20 22:12
接口可以继承接口。
抽象类不是具体类,不可可实现(implements)接口。
抽象类不可继承具体类(concrete clas ...

你复制我上面的代码   编译通过没有问题  这几条都能达到
回复 使用道具 举报
夸克 发表于 2015-8-21 04:15
首先,这几个问题答案都是可以。
针对你的三个疑问
1.抽象类不用全部实现接口中的所有方法,其余的方法实现 ...

所以你的意思是说  用抽象类来实现接口 并由抽象类的子类去继承调用 是为了提高接口功能的复用性对吧?  这个好像可以理解   那么抽象类继承具体类这一点上有没有应用实例呢?
回复 使用道具 举报
sunsteam 发表于 2015-8-21 08:37
所以你的意思是说  用抽象类来实现接口 并由抽象类的子类去继承调用 是为了提高接口功能的复用性对吧?   ...

这个你还有疑问啊,Object类不就是具体类吗,你看API中定义的抽象类是不是都写着继承自Object
回复 使用道具 举报
夸克 发表于 2015-8-21 13:57
这个你还有疑问啊,Object类不就是具体类吗,你看API中定义的抽象类是不是都写着继承自Object
...

好吧 我知道是可以 但是没见到有这样用过的   想了下也许是继承某些具体功能但是部分功能抽象的情况下有可能这样用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马