java编程思想复用,多态,以及设计模式-多态

原创 2013年07月14日 22:51:39

多态是面向对象的编程语言中非常重要的一种特性,通过分离做什么和怎样做,可以把接口和实现分离开来。多态是通过向上转型实现的,而即使向上转型了还仍然可以正确调用子类的方法,这就是动态绑定,又叫后期绑定这种特性实现的。

下面,我分别举普通类,接口,内部类来说明多态。

普通类

class Instrument {
  void play(Note n) { print("Instrument.play() " + n); }
  String what() { return "Instrument"; }
  void adjust() { print("Adjusting Instrument"); }
}

class Wind extends Instrument {
  void play(Note n) { print("Wind.play() " + n); }
  String what() { return "Wind"; }
  void adjust() { print("Adjusting Wind"); }
}	

class Percussion extends Instrument {
  void play(Note n) { print("Percussion.play() " + n); }
  String what() { return "Percussion"; }
  void adjust() { print("Adjusting Percussion"); }
}



public class Music3 {
  public static void tune(Instrument i) {
    i.play(Note.MIDDLE_C);
  }
  public static void main(String[] args) {
    Instrument[] orchestra = {
      new Wind(),
      new Percussion()
    };
    for(Instrument i:orchestra)
	tune(i);
  }
} /* Output:
Wind.play() MIDDLE_C
Percussion.play() MIDDLE_C

这个例子可就体现出了多态的好处,可以后期添加新的类,进行扩展,而无需修改已有的调用方法,这就把需要改变的和不变的分开了,这就是多态的好处。

接口和抽象类:

接口和抽象类为多态提供了一种更加结构化的方法。接口和抽象类的区别,就是抽象类并不是纯接口,它可以实现方法。我就举个接口的例子吧。

interface Instrument {
 
  void play(Note n); // Automatically public
  void adjust();
}

class Wind implements Instrument {
  public void play(Note n) {
    print(this + ".play() " + n);
  }
  public String toString() { return "Wind"; }
  public void adjust() { print(this + ".adjust()"); }
}

class Percussion implements Instrument {
  public void play(Note n) {
    print(this + ".play() " + n);
  }
  public String toString() { return "Percussion"; }
  public void adjust() { print(this + ".adjust()"); }
}

class Brass extends Wind {
  public String toString() { return "Brass"; }
}	

class Woodwind extends Wind {
  public String toString() { return "Woodwind"; }
}

public class Music5 {
  
  static void tune(Instrument i) {
   
    i.play(Note.MIDDLE_C);
  }
  static void tuneAll(Instrument[] e) {
    for(Instrument i : e)
      tune(i);
  }	
  public static void main(String[] args) {
    // Upcasting during addition to the array:
    Instrument[] orchestra = {
      new Wind(),
      new Percussion(),
      new Brass(),
      new Woodwind()
    };
    tuneAll(orchestra);
  }
} /* Output:
Wind.play() MIDDLE_C
Percussion.play() MIDDLE_C
Stringed.play() MIDDLE_C
Brass.play() MIDDLE_C
Woodwind.play() MIDDLE_C

这个例子就看出接口的好处了,要调用这个方法,只要实现了这个接口即可,而如果用普通的类则必须继承,可见还是实现接口比比较方便。

这里还涉及到一种设计方式,可以完全解耦合,这个将放在设计模式里面讲。通过这种设计模式,你就会知道通过接口可以完全解耦合。

内部类:

内部类重要的特性且我们平常能过用到的就是,能够实现多重继承,你也许会说接口也能实现多重继承,但如果要继承的是2个类呢,那恐怕不行了吧,可内部类就可以。

当用内部类实现了多重继承时,你就可以多态地转换为多种类型了。看代码:

interface A {}
interface B {}

class X implements A, B {}

class Y implements A {
  B makeB() {
    // Anonymous inner class:
    return new B() {};
  }
}

public class MultiInterfaces {
  static void takesA(A a) {}
  static void takesB(B b) {}
  public static void main(String[] args) {
    X x = new X();
    Y y = new Y();
    takesA(x);
    takesA(y);
    takesB(x);
    takesB(y.makeB());
  }
} 

看这就是内部类的强大,当然如果你不需要多重继承的话,当然可以用到其它代码来实现。

总结:接口和内部类结合起来,就可以解决C++中多重继承所能解决的问题,而且容易理解的多。

多态机制,其实是设计阶段考虑的问题,到底该用什么样的设计方式,用接口还是内部类的,得看实际情况,随着编程经验的增加,到底用什么样的实现方式会有更深的理解。

欢迎评论,欢迎讨论。





相关文章推荐

操作系统之轮转法调度

时间片轮转法RR: 算法描述;用于分时系统中的进程调度,每次调度时,选择就绪队列在队首的进程,让其在 CPU运行一个系统预设的时间片,一个时间片没有完成的进程, 返回到就绪队列的队尾重新排队,等待下...

排序算法之归并排序

归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。 一:原理 1、算法基本思路      设两个有序的子文件(相当于输...

java编程思想复用,多态,以及设计模式-复用篇

最近,在看java编程思想,觉得这的确是一本难得的好书。目前已经看到了第12章异常,个人觉得本书的最精华部分是讲述了,类的复用,多态以及几种常见的设计模式(这些其实就是面向的对象的编程思想),所以我就...
  • zbh24
  • zbh24
  • 2013年07月14日 11:25
  • 452

Java编程思想——多态

8 多态在面向对象设计语言中,多态是继封装,继承之后的第三种基本特征。多态通过分离做什么和怎么做,从另一个角度将接口和实现分离。8.1 再论向上转型已知对象既可以作为它自己本身的类型使用,也可以作为它...

Java编程思想第四版读书笔记——第八章 多态

本来不打算看了,现在面试笔试发现还是要重新拾起来看一遍。老老实实啃砖吧  第八章 多态 在面向底下的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 “封装”通过合并特征和行为来创建新...

JAVA编程思想学习总结:第八章——多态

(1)转型后方法执行的规则 若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),路段前期绑定。这是面向过程的语言中不需要选择就默认的绑定方式。后期绑定就是在运行时根据对象的类型进行绑定。后期...

重温《JAVA编程思想》----2017.1.12 多态与接口(完结版)

多态:     1.private方法被自动认定为是final方法,并且对子类是屏蔽的。     2.编译器强制每个子类(都继承自Object)必须调用构造器的原因:可以确保我们想要使用的成员对象都得...

JAVA编程思想学习第八篇の多态

在面向对象的程序设计语言中

Java编程思想多态笔记

多态

【Java编程思想笔记】第八章-多态

多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来,多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。 前期绑定在编译时期(如C),后期绑定是在运行时期(即多态,C++与Java...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java编程思想复用,多态,以及设计模式-多态
举报原因:
原因补充:

(最多只允许输入30个字)