1 class Animal 2 { 3 private String name; 4 Animal(String name) 5 { 6 this.name=name; 7 } 8 public void enjoy() 9 { 10 System.out.println("叫声。。。"); 11 } 12 } 13 class Cat extends Animal 14 { 15 private String eyeColor; 16 Cat(String n,String eyeColor) 17 { 18 super(n); 19 this.eyeColor=eyeColor; 20 } 21 public void enjoy() 22 { 23 System.out.println("猫叫声。。。"); 24 } 25 } 26 class Dog extends Animal 27 { 28 private String furColor; 29 Dog(String n,String furColor) 30 { 31 super(n); 32 this.furColor=furColor; 33 } 34 public void enjoy() 35 { 36 System.out.println("狗叫声。。。"); 37 } 38 } 39 /* 40 class Bird extends Animal 41 { 42 Bird() 43 { 44 super("bird"); 45 } 46 public void enjoy() 47 { 48 System.out.println("鸟叫声。。。"); 49 } 50 }*/ 51 class Lady 52 { 53 private String name; 54 private Animal Pet; 55 Lady(String name,Animal Pet) 56 { 57 this.name=name; 58 this.Pet=Pet; 59 } 60 public void petEnjoy() 61 { 62 Pet.enjoy(); 63 } 64 } 65 class Test 66 { 67 public static void main(String [] args) 68 { 69 Cat c=new Cat("catname","blue"); 70 Dog d=new Dog("dogname","black"); 71 //Bird b=new Bird(); 72 Lady L1=new Lady("L1",c); 73 Lady L2=new Lady("L2",d); 74 //Lady L3=new Lady("L3",b); 75 L1.petEnjoy(); 76 L2.petEnjoy(); 77 //L3.petEnjoy(); 78 } 79 } 80 /* 81 F:java_examplelesson6>java Test 82 猫叫声。。。 83 狗叫声。。。 84 */
类的多态性,也叫动态绑定。它是指代码在执行期间(也就是编译之后,进行运行操作)判断所引用对象的实际类型,根据其实际的类型调用相应的方法。
对应上述代码我们可以看到,L1对应的c是Cat的对象,而Lady中c是Animal的引用句柄,如果根据引用类型那就要调用Animal的enjoy(),若按照实际类型,应该调用Cat的enjoy(),动态绑定这种机制就是指实际当中用的是什么类型就调用谁的enjoy()方法,实际中new的是Cat,所以调用Cat的enjoy()。之前是有一个指针指向了Animal的enjoy(),但一旦运行起来,指针就指向了Cat的enjoy()方法。所以只有在运行期间,new了之后,我才知道到底是调用哪个方法,这就是动态绑定的机制。简言之,方法被重写了,实际当中new的是谁,就调用谁的方法。
多态的特点:
可扩展性(就像上述代码中写到一样,如果我现在要加上鸟叫,那我只需要增加类,将代码中的注释去掉,不用过多修改程序)
多态的实现三个必备条件:继承;重写方法;父类引用指向子类对象