在java对象中,对象既可以作为他自己本身的类型使用,也可以作为他的基类型使用,把这种对积累性的引用的做法称为向上转型
package com.paragraph.one;
public enum Note{
MIDDLE_C,C_SHARP,B_FLAT;
}
package com.paragraph.one;
public class Instrument {
public Instrument() {
// TODO Auto-generated constructor stub
System.out.println("Instrument");
}
public void play(Note n){
System.out.println("Instrument.play()");
}
}
package com.paragraph.one;
public class Wind extends Instrument{
public Wind() {
// TODO Auto-generated constructor stub
System.out.println("Wind");
}
public void play(Note n){
System.out.println("Wind.play"+n);
}
}
package com.paragraph.one;
public class Music {
public static void tune(Instrument i){
System.out.println(i);
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind fluteWind = new Wind();
System.out.println(fluteWind);
tune(fluteWind);
}
}
输出结果为:
Instrument
Wind
com.paragraph.one.Wind@1d2fc36
com.paragraph.one.Wind@1d2fc36
Wind.playMIDDLE_C
要注意上面调用的是wind的方法,而不是基类的方法。
将一个方法调用同一个方法主体关联起来称为绑定,在程序执行之前进行绑定称为前期绑定,一般的C语言等面向过程语言只支持前期绑定,面向过程语言提供了一种后期绑定。
java中除了static方法和final方法之外,其他的方法都是后期绑定,所以前面的是输出的wind的方法,但是如果加上static方法,就会调用Instrument中的play方法了