概念
- 绑定:一个方法的调用与方法的所在类【方法主体】关联起来
- 前期绑定:final、static、private、构造方法、成员变量【包括静态及非静态】
- 后期绑定:除了前期绑定之外的其他方法属于后期绑定,运行时能判断对象的类型进行绑定
注:为了执行后期绑定,Java 使用一小段特殊的代码来替代绝对地址调用,这段代码使用在对象中存储的信息来计算方法体的地址(过程在以后详述),这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。所以,当向一个对象发送消息时,该对象就能知道对这条消息应该做些什么
举例说明
- Person【人类】
/**
* 描述:人类
*/
class Person{
protected String UNIQUE_FLAG = "Person";
/** 心 **/
private Heart heart;
public Person(){
System.out.println("Person created......");
};
public Person(String id,String name){
super(id,name);
}
public Person(String name){
super(name);
}
public Heart getHeart() {
return heart;
}
public void setHeart(Heart heart) {
this.heart = heart;
}
/**
* 描述:购买
* @param <E>
* @return
*/
public static <E> List<E> buy(E arg,int num){
return MagicStore.get(arg,num);
}
public static void birth(){
System.out.println("降临人世间......");
}
public static void die(){
System.out.println("走向人间天堂......");
}
public void breath(){
System.out.println("Person" + "呼吸......");
}
}
- Boy【男孩】
/**
* 描述:男孩
*/
class Boy extends Person{
protected String UNIQUE_FLAG = "Boy";
/** 男孩的心 **/
private Heart heart;
public Boy(){
System.out.println("Boy created......");
}
public Boy(String name){
super(name);
}
Boy(String id,String name){
super(id, name);
}
public static void birth(){
System.out.println("Boy" + "降临人世间......");
}
public static void die(){
System.out.println("Boy" + "走向人间天堂......");
}
@Override
public void breath(){
System.out.println("Boy" + "呼吸......");
}
}
- 测试类
public class AyTest {
public static void main(String[] args){
// 男孩产生,用 Person 引用,打印 1 和 2 结果
Person boy = new Boy();
// 男孩出生,由于 birth 是静态方法,是前期绑定,所以调用 person 的 birth 方法
boy.birth();
// final 常量也是前期绑定,所以调用父类 Person 的 UNIQUE_FLAG 常量
System.out.println(boy.UNIQUE_FLAG);
// breath 是后期绑定,所以调用 boy 的 breath 方法
boy.breath();
// 编译报错,访问权限的原因
boy.heart;
}
}
- 打印结果
Person created...... 1
Boy created...... 2
降临人世间...... 3
Person 4
Boy呼吸...... 5