在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方法了
原文:http://blog.csdn.net/runningtortoises/article/details/41380945