Java接口-多重继承-Java编程思想

朱雀 2022-06-01 04:53 433阅读 0赞

概述

最近把Java基础知识梳理了一下,发现了一些以前理解有偏差的地方,记录在此。

疑问

  • 一个类同时继承基类和多个接口时,该类中是否可以不实现接口中的方法?
  • 一个类同时实现多个接口,能否向上转型到各接口?
  • 一个类同时实现多个接口,接口中的方法签名是否可以保持一样?

代码解惑

  1. package think.in.java.interfaces;//: interfaces/Adventure.java
  2. // Multiple interfaces.
  3. import static net.mindview.util.Print.print;
  4. interface CanFight {
  5. void fight();
  6. }
  7. interface CanSwim {
  8. void swim();
  9. }
  10. interface CanFly {
  11. void fly();
  12. }
  13. class ActionCharacter {
  14. public void fight() {
  15. print("base class fight method");
  16. }
  17. }
  18. /** * 继承一个类、多个接口 */
  19. class Hero extends ActionCharacter
  20. implements CanFight, CanSwim, CanFly {
  21. public void swim() {
  22. print("sub class swim method");
  23. }
  24. public void fly() {
  25. print("sub class fly method");
  26. }
  27. // @Override
  28. // public void fight() {
  29. // print("sub class fight method");
  30. // }
  31. }
  32. public class Adventure {
  33. public static void t(CanFight x) {
  34. // 如果 Hero 没有重写父类的fight方法,则调用父类的fight方法
  35. x.fight();
  36. }
  37. public static void u(CanSwim x) {
  38. x.swim();
  39. }
  40. public static void v(CanFly x) {
  41. x.fly();
  42. }
  43. public static void w(ActionCharacter x) {
  44. // Hero 没有重写父类的fight方法,则调用父类的fight方法
  45. x.fight();
  46. }
  47. public static void main(String[] args) {
  48. Hero h = new Hero();
  49. t(h); // Treat it as a CanFight
  50. u(h); // Treat it as a CanSwim
  51. v(h); // Treat it as a CanFly
  52. w(h); // Treat it as an ActionCharacter
  53. }
  54. } ///:~

输出:

  1. base class fight method
  2. sub class swim method
  3. sub class fly method
  4. base class fight method

一个类同时继承基类和多个接口时,该类中是否可以不实现接口中的方法?

我们发现,Hero实现了CanFight接口,CanFight接口中定义了fight()方法。但是在Hero中却并没有实现该方法。
其实这个问题也好理解,因为Hero类继承了ActionCharacter基类,而ActionCharacter基类中实现了fight()方法。父类的方法,子类自然有权限使用。
所以,在CanFight xActionCharacter x引用调用fight()方法时,自然引用到了基类的fight()方法。

一个类同时实现多个接口,能否向上转型到各接口?

这个从代码中我们可以看到,Hero子类可以作为参数传递给CanFightCanSwimCanFly等类型。所以,是可以向上转型到各接口的。

Java允许实现多个接口,而不是继承多个类。这消除了我们在组合相同基类实现时使用的两个相同成员的不确定性。
看代码:

  1. /** * 第一个接口 */
  2. interface BaseInterface {
  3. void f();
  4. }
  5. interface IntermediateInterface1 extends BaseInterface {
  6. void f();
  7. }
  8. interface IntermediateInterface2 extends BaseInterface {
  9. void f();
  10. }
  11. /** * 多重继承接口 */
  12. interface CombinedInterface
  13. extends IntermediateInterface1, IntermediateInterface2 {
  14. void f();
  15. }
  16. class CombinedImpl implements CombinedInterface {
  17. public void f() {
  18. System.out.println("CombinedImpl.f()");
  19. }
  20. }
  21. /** * 创建一个接口,并从该接口继承两个接口,然后从后面两个接口多重继承第三个接口 */
  22. public class E13_Diamond {
  23. public static void main(String[] args) {
  24. new CombinedImpl().f();
  25. }
  26. } /* Output: CombinedImpl.f() *///:~

一个类同时实现多个接口,接口中的方法签名是否可以保持一样?

CombinedImpl实现了CombinedInterface,而CombinedInterface又分别继承了IntermediateInterface1IntermediateInterface2接口,IntermediateInterface1IntermediateInterface2接口继承了BaseInterface接口。
而这些接口都有’f()’方法。所以是可以的。
试想一下,如果同时继承两个基类,而碰巧两个基类中有同样的方法。那么向上转型后,调用该方法,程序是不是就不知道该调用A基类的方法还是B基类的方法了呢? 不过接口是可以这么干的。

发表评论

表情:
评论列表 (有 0 条评论,433人围观)

还没有评论,来说两句吧...

相关阅读

    相关 9接口-Java编程思想

    你不能总是用纯接口,抽象类也是重要的工具。 包含抽象方法的类叫抽象类。抽象类中不一定有抽象方法,但是有了抽象方法一定要被定义为抽象类。如果抽象类中不含有任何的抽象方法,那么就

    相关 java中"多重继承"方案

    我们知道java中接口是支持多继承的,但是类是不支持进行多继承的,但是有些时候难免会遇到可能需要用到多个类中的某些成员或者方法,这个时候怎么办呢? 利用内部类可以独立继承一个