概念:
动态绑定:在执行期间(非编译期间)判断所引用的对象的实际类型,根据实际类型调用其相应的方法。如下例程序中,根据person对象的成员变量pet所引用的不同的实际类型调用相应的方法。
具体实现好像是在java的底层机制中有一个指针会动态指向相应类。
1 class Animal{ //定义Animal基类 2 private String name; //成员变量 3 public Animal(String s) { //Aniamal的构造函数 4 name = s; 5 } 6 public void print(Animal a) { 7 System.out.println("name: "+a.name); //输出动物名字 8 } 9 public void voice() { 10 System.out.println("Animal voice"); //输出动物叫声 11 } 12 } 13 class Cat extends Animal{ //定义Cat类exends(继承)于Animal 14 public String voice; 15 public void voice() { 16 System.out.println("猫叫声:Miao~~~"); 17 } 18 public Cat(String name1) { //Cat的构造函数 19 super(name1);//用super()调用父类的构造函数,完成名字输入。 20 } 21 } 22 class Dog extends Animal{ //定义Dog类exends(继承)于Animal 23 Dog(String name2) //Dog的构造函数 24 { 25 super(name2); //用super()调用父类的构造函数。语法要求 26 } 27 public void voice() { 28 System.out.println("狗叫声:Wang~Wang~Wang~"); 29 } 30 } 31 class person{ //定义一个独立的person类,实现多态。 32 private Animal pet; //定义一个动物类的成员变量 33 public person(Animal animal) { //person的构造函数,养的宠物是什么动物。 34 pet = animal; 35 } 36 public void petvoice(){ //实现多态 37 pet.voice(); //根据传入的动物类型调用相应的方法。 38 } 39 } 40 public class TestDuoTai { 41 public static void main(String[] args) { 42 Cat c2 = new Cat("Kitty"); //new出一个Cat 43 Dog d2 = new Dog("Snube"); //new出一个Dog 44 person p = new person(c2); 45 person p2 = new person(d2); 46 p2.petvoice(); 47 p.petvoice(); //调用方法,多态。 48 } 49 }
编译结果:
小插曲:在用JDK编译的时候发现用的GBK编码,和java默认的Unicode编码不同,导致所有中文都出现乱码。
只好在编译时临时去掉所有中文。具体解决方法,未知。