动态绑定和多态——面向对象最核心的机制
2017-01-24 14:26
288 查看
一、动态绑定和多态
动态绑定也叫多态,动态绑定是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法。
多态的存在有三个必要条件:
1、继承
2、重写
3、父类引用指向子类对象
例一:
abstract class Animal {
private String name;
Animal(String name) {this.name = name;}
public void enjoy(){
System.out.println("叫声......");
}
public abstract void enjoy();
}
如果只从上一节对象转型来考虑,这个程序不管是猫和狗,输出都是“叫声......”,但实际上,分别输出了正确的"猫叫声......","狗叫声......",这就叫做动态绑定。看下图
pet 和 c 指向的实际是同一个对象,但由于它是 Animal 对象,所以它只能看见里面的父类对象,如果想访问里面的 eyesColor 和 furColor 之类的肯定是不行的。但这时访问的是里面的方法,方法是单独放在 code segment 当中的。访问这个方法要先找到这个对象,然后看这个方法存储在什么地方。
要注意,此时不是通过引用类型来确定方法的位置的,如果是通过引用类型确定的话,调用的一定是左边这个Animal的enjoy方法。现在是根据实际的类型来确定的。new的是谁,就调谁的enjoy方法。
更深的机制在于,对象内部有一个enjoy方法的指针,指向这个方法,在new这个对象的时候,指针的对象随之改变,new 的什么对象,就指向这个对象重写的这个方法。
动态绑定使可扩展性做到最好
动态绑定也叫多态,动态绑定是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法。
多态的存在有三个必要条件:
1、继承
2、重写
3、父类引用指向子类对象
例一:
abstract class Animal {
private String name;
Animal(String name) {this.name = name;}
public void enjoy(){
System.out.println("叫声......");
}
public abstract void enjoy();
}
abstract class Cat extends Animal { private String eyesColor; Cat(String n,String c) {super(n); eyesColor = c;} public void enjoy() { System.out.println("猫叫声......"); } //public abstract void enjoy(); }
class Dog extends Animal { private String furColor; Dog(String n,String c) {super(n); furColor = c;} public void enjoy() { System.out.println("狗叫声......"); } }
class Bird extends Animal { Bird() { super("bird"); } 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 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(); } }
如果只从上一节对象转型来考虑,这个程序不管是猫和狗,输出都是“叫声......”,但实际上,分别输出了正确的"猫叫声......","狗叫声......",这就叫做动态绑定。看下图
pet 和 c 指向的实际是同一个对象,但由于它是 Animal 对象,所以它只能看见里面的父类对象,如果想访问里面的 eyesColor 和 furColor 之类的肯定是不行的。但这时访问的是里面的方法,方法是单独放在 code segment 当中的。访问这个方法要先找到这个对象,然后看这个方法存储在什么地方。
要注意,此时不是通过引用类型来确定方法的位置的,如果是通过引用类型确定的话,调用的一定是左边这个Animal的enjoy方法。现在是根据实际的类型来确定的。new的是谁,就调谁的enjoy方法。
更深的机制在于,对象内部有一个enjoy方法的指针,指向这个方法,在new这个对象的时候,指针的对象随之改变,new 的什么对象,就指向这个对象重写的这个方法。
动态绑定使可扩展性做到最好
相关文章推荐
- Java面向对象 多态动态绑定(非静态成员函数、成员变量、静态成员函数)
- Java 多态:动态绑定 及 内部实现机制
- Java学习之面向对象(1.Object类,(1)toString方法,(2)equals方法,2.对象转型(casting),3.动态绑定与多态,4.抽象类(abstract),5.Final关键字)
- java多态总结以及动态绑定机制
- 继承机制的两个特性:多态+动态绑定
- 【转】C语言实现C++面向对象的封装、继承、多态机制
- 面向对象的核心:多态(Ploymorphism)
- JAVA动态绑定的内部实现机制(转)-asp.net关注
- Python的动态绑定与赋值机制
- 动态绑定和多态
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- Java的动态绑定机制
- 动态语言的动态绑定的实现机制, 以及改进
- 利用override多态原理实现对相似页面的后台代码的抽象,并实现动态GridView动态列数据绑定
- JAVA动态绑定的内部实现机制
- java の 动态绑定机制的内幕
- 方法重载、多态+动态绑定
- JAVA动态绑定的内部实现机制
- Python的动态类型绑定与赋值机制
- JAVA动态绑定的内部实现机制