Thinking in Java --多态

在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方法了

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。