- 绑定: 将一个方法调用同一个方法主体关联起来被称作绑定。
- 前期绑定: 在程序执行前进行绑定,叫做前期绑定。
- 后期绑定: 在运行时根据对象的类型进行绑定,叫做后期绑定。后期绑定也叫做动态绑定或运行时绑定。
下面结合具体代码讲讲后期绑定这件事儿:
/**
* @Description 乐器
* @Author .Mark
* @Date 2019年2月28日
*/
public class Instrument {
// 演奏
public void play() {
System.out.println("Instrument play music.");
}
}
/**
* @Description 钢琴
* @Author .Mark
* @Date 2019年2月28日
*/
public class Piano extends Instrument {
// 演奏
@Override
public void play() {
System.out.println("Piano play music.");
}
}
/**
* @Description 吉他
* @Author .Mark
* @Date 2019年2月28日
*/
public class Guitar extends Instrument {
// 演奏
@Override
public void play() {
System.out.println("Guitar play music.");
}
}
/**
* @Description 音乐家
* @Author .Mark
* @Date 2019年2月28日
*/
public class Musician {
// 表演
public void perform(Instrument instrument) {
instrument.play();
}
public static void main(String[] args) {
Musician musician = new Musician();
musician.perform(new Instrument());
musician.perform(new Piano());
musician.perform(new Guitar());
}
}
// output:
// Instrument play music.
// Piano play music.
// Guitar play music.
我现在有一个父类Instrument,有两个子类Piano、Guitar继承自Instrument,并重写了play方法。然后再创建一个Musician类,这个类有一个方法perform,入参是Instrument。
子类继承父类,父类对外提供的接口,子类肯定都有。所以Musician类的perform方法能接受Instrument类型的入参,也可以接受Piano、Guitar类型的入参。
直到Musician的perform方法被调用,才能知道具体是谁在调用play方法,这个就是动态绑定了。
动态绑定依赖于多态,正是因为可以使用父类的引用指向子类的对象,所以在执行Musician类的perform方法时,我才可以根据入参去用Piano演奏、用Guitar演奏。这极大的增加了perform的灵活性,因为在表演之前我并没有对外说明具体用什么乐器表演,我只说了音乐家要演奏乐器,所如果今天音乐家有表演,但是钢琴出了故障,那么我还可以用吉他演奏。