Java的多态性

如果要深入了解Java的多态性的话,首先要知道“绑定”一词.

绑定分为二种:

1.前期绑定:是在程序执行前绑定;

2.后期绑定(动态绑定、运行时绑定):是在程序执行时根据对象的类型进行绑定;

 

向上转型:is-a

向下转型:is-like-a

 

首先看一个例子:

enum Note{MIDDEL,String_C,B_LEFT}

class Instrument
{
	public void play(Note n)
	{
		System.out.println("Instrument play()");
	}
}
class Wind extends Instrument
{
	public void play(Note n)
	{
		System.out.println("Wind play()");
	}
} 
class Stringed extends Instrument
{
	public void play(Note n)
	{
		System.out.println("Stringed play()");
	}
}
public class Music2
{
 
	public static void tune(Wind i)//重载也是一种多太只有在运行时才能确定
	{
		i.play(Note.B_LEFT);
	}
 
	public static void tune(Stringed i)//重载也是一种多太只有在运行时才能确定
	{
		i.play(Note.B_LEFT);
	}
	public static void tune(Instrument i)//有了这个方法,Instrument引用的对象是可扩展的只和基类接口通信
	{
		//这里的绑定是动态绑定,是在程序执行时根据i引用的对象的类型来执行play()方法

		i.play(Note.B_LEFT);
	}
	
	
	public static void main(String[] args)
	{
		Wind w =new Wind();
		tune(w);
		Stringed s =new Stringed();
		tune(s);
	}
}


多态:将改变的事物和未改变的事物分离开来
改变事物是添加Wind 这样的对象或是删除这样的对象 和main方法的添加对象
不改变的事物是tune();这个方法是不需要改变

在java中static final 类型方法(private方法属于final方法)不是动态绑定的 如下代码:

 

class SupClass
{
	public static void staticMothed()
	{
		System.out.println("SupClass staticMothed()");
	}
	public static void dynamicGet()
	{
		System.out.println("SupClass dynamicGet()");
	}
}
class SubClass extends SupClass
{
	public static void staticMothed()
	{
		System.out.println("SubClass staticMothed()");
	}
	public static void dynamicGet()
	{
		System.out.println("SubClass dynamicGet()");
	}
}

public class StaticMethod
{
	
	public static void main(String[] args)
	{
		SupClass sup = new SubClass();
		sup.staticMothed();
		sup.dynamicGet();
	}
}
/**执行结果:
SupClass staticMothed()
SupClass dynamicGet()
 * */



 

 


 

 

你可能感兴趣的:(Java的多态性)