动态绑定:

运行时根据对象的类型进行绑定;以便在运行时能判断对象的类型,从而调用正确的方法。
对象工厂实例:

  1. class Shape {
  2. public void draw() {//画方法
  3. }
  4. public void erase() {//擦除方法
  5. }
  6. }
  7. class Circle extends Shape {//圆形
  8. @Override
  9. public void draw() { System.out.println("画圆形"); }
  10. @Override
  11. public void erase() { System.out.println("擦除圆形"); }
  12. }
  13. class Triangle extends Shape {//三角形
  14. @Override
  15. public void draw() { System.out.println("画三角形"); }
  16. @Override
  17. public void erase() { System.out.println("擦三角形"); }
  18. }
  19. class Square extends Shape {//正方形
  20. @Override
  21. public void draw() { System.out.println("画方形"); }
  22. @Override
  23. public void erase() { System.out.println("擦方形"); }
  24. }
  25. class RandomShapeGenerator {
  26. private Random random=new Random(47);
  27. public Shape next(){//对象选择器,通过switch循环,传入指定的数组便能创建相应的对象
  28. switch (random.nextInt(3)){
  29. default:
  30. case 0: return new Circle();
  31. case 1: return new Triangle();
  32. case 2:return new Square();
  33. }
  34. }
  35. }
  36. public class Shapes{
  37. public static void main(String[] args) {
  38. RandomShapeGenerator gen=new RandomShapeGenerator();
  39. Shape[] s =new Shape[9];
  40. for(int i=0;i<s.length;i++){
  41. s[i]=gen.next();
  42. }
  43. for (Shape shp:s) {
  44. shp.draw();
  45. }
  46. }
  47. }

多态只存在于普通方法中对于静态方法,是不具有多态性的

  1. package com.zx.test08;
  2. class StaticSupe{
  3. public static String staticSupeGet(){
  4. return "staticSuperGet";
  5. }
  6. public String dynamSupeGet(){
  7. return "dynamSupeGet()";
  8. }
  9. }
  10. class StaticSub extends StaticSupe{
  11. public static String staticSubGet(){
  12. return "staticSubGet=====";
  13. }
  14. public String dynamSubGet(){
  15. return "dynamSubGet()==========";
  16. }
  17. }
  18. public class StaticPolymorphism {
  19. public static void main(String[] args) {
  20. StaticSupe sup = new StaticSub();
  21. System.out.println(sup.dynamSupeGet());
  22. System.out.println(sup.staticSupeGet());
  23. }
  24. }

注意:基类中private修饰的方法不能被子类覆盖,虽然编译器不会报错,但会和我们所要的结果不同,所说我们要在子类中对于基类的private方法要采用不用的方法名去命名,以便我门可以区分。