定义:动态绑定是指在执行期间(非编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
运用多态的三个必要条件:
1、要有继承 2、要有方法重写 3、父类引用指向子类对象
- package com.sxt;
- class Animal {
- private String name;
- Animal(String name) {
- this.name = name;
- }
- public void enjoy() {
- System.out.print("叫声...");
- }
- }
- class Cat extends Animal {
- private String eyesColor;
- Cat(String n, String c) {
- super(n);
- eyesColor = c;
- }
- public void enjoy() {
- System.out.print("猫叫声...");
- }
- }
- class Dog extends Animal {
- private String furColor;
- Dog(String n, String c) {
- super(n);
- furColor = c;
- }
- public void enjoy() {
- System.out.print("狗叫声...");
- }
- }
- class Bird extends Animal {
- Bird() {
- super("bird");
- }
- public void enjoy() {
- System.out.print("鸟叫声...");
- }
- }
- class Lady {
- private String name;
- private Animal pet;
- Lady(String name, Animal pet) {
- this.name = name;
- this.pet = pet;
- }
- public void myPetEnjoy() {
- pet.enjoy();
- }
- }
- public class Test {
- public static void main(String args[]) {
- Cat c = new Cat("catname", "blue");
- Dog d = new Dog("dogname", "black");
- Bird b = new Bird();
- Lady l1 = new Lady("l1", c);
- Lady l2 = new Lady("l2", d);
- Lady l3 = new Lady("l3", b);
- l1.myPetEnjoy();
- l2.myPetEnjoy();
- l3.myPetEnjoy();
- }
- }
- //输出结果:猫叫声... 狗叫声... 鸟叫声...
结果分析:程序执行到Lady l1 = new Lady("l1", c)这句时,c会被转换为Animal类型。此时,它只能访问Animal类中的成员变量,而不能访问Cat类中的成员变量。
程序执行到 l1.myPetEnjoy()这句时,会调用enjoy()方法。而这个方法是Cat中的enjoy()方法,而不是Animal中enjoy()方法。这就是多态的应用,增强了程序的可扩展性。如果程序中再添加一个从Animal继承的类,需要用到enjoy()方法时。只需调用Lady中的myPetEnjoy()方法,不需改动程序的结构。
转载于:https://blog.51cto.com/mb1069/1048918