10、多态

来源:互联网 发布:清华软件研究生怎么样 编辑:程序博客网 时间:2024/05/16 17:41
一 多态
1.1 动态绑定/多态
动态绑定是指“在执行期间(而非编译期间)”判断所引用对象的实际类型,根据实际的类型调用其相应的方法

如下面一段代码

class Animal {
    private String name;

    Animal(String name) {
        this.name = name;
    }

    public void enjoy() {
        System.out.println("叫声......");
    }
}

class Cat extends Animal {
    private String eyeColor;

    Cat(String n, String c) {
        super(n);
        eyeColor = c;
    }

    public void enjoy() {
        System.out.println("猫叫声......");
    }
}

class Dog extends Animal {
    private String furColor;

    Dog(String n, String c) {
        super(n);
        furColor = c;
    }

    public void enjoy() {
        System.out.println("狗叫声......");
    }
}

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 TestPolymorph {
    public static void main(String[] args) {
        Cat c = new Cat("catname","blue");
        Dog d = new Dog("dogname","black");
        Lady l1 = new Lady("l1",c);
        Lady l2 = new Lady("l2",d);
        l1.myPetEnjoy();
        l2.myPetEnjoy();
    }
}

其内存结构如下图所示:

以l1为例,l1类型为Lady,对象有name和pet,其中pet是Animal类型。name为l1,pet为c,但是由于pet为Animal类型,所以pet只能访问c的name属性;
l1.myPetEnjoy(),其中myPetEnjoy()调用enjoy()方法,调用的是实际的enjoy()方法,而不是引用类型的方法。所以调用的是c对象里面的enjoy()方法,而不是c的引用方法。所以指向Cat类里面的enjoy()方法

多态的三个必要条件:
  • 要有继承
  • 要有重写
  • 父类引用指向子类对象


1.1.1 多态的好处和弊端
  • 多态的好处:
    • 提高了程序的维护性
    • 提高了程序的扩展性
  • 多态的弊端
    • 不能访问子类特有功能


原创粉丝点击