首页 > 代码库 > java笔记多态性

java笔记多态性

今天听一个同学讲了java动态绑定的一个很好地例子,我深受启发,特此记录。java动态绑定是在运行时才会具体绑定,而不是在编译的时候进行相关操作,这为代码的灵活性提供了极大便利,也使得维护边的较为简便。


对于动态绑定我的理解是,在定义一个方法 的时候,需要某些参数,比如一个类对象,但是在运行的时候这个对象才回确定,比如打CS时候的各种枪,这个时候,为这个方法重载不同的对象参数会变得极为繁琐,所以我们可以造一个枪的父类,把父类的对象传到这个参数中,在运行时,再决定是哪种具体的枪。

 

class Gun {	public void shot(){		System.out.println("Gun shot");	}}class Pistol extends Gun {	public void shot(){		System.out.println("Pistol shot");	}}class Rifle extends Gun {	public void shot(){		System.out.println("Rifle shot");	}}class Terrist {	private Gun mygun;	Terrist(Gun gun){		mygun = gun;	}	public void pulltrigger(){		mygun.shot();	}}public class LateBind{	public static void main(String[] args) {	Terrist t1 = new Terrist(new Gun());	t1.pulltrigger();	Terrist t2 = new Terrist(new Pistol());	t2.pulltrigger();	Terrist t3 = new Terrist(new Rifle());	t3.pulltrigger();    }}

  

定义一个父类叫做Gun,它有一个方法叫做shot(),输出为“Gun shot”,在定义一个子类,Pistol(shou枪) ,Rifle(步枪),各自都重写了父类的方法,输出“Pistol shot”和“Rifle shot”。在定义一个Terrist,有一个方法pulltrigger(),会调用自己的gun的shot方法。我们知道不同的枪的shot是不同的,但是如果为每个枪都重载一个pulltrigger()方法,代码会冗余。但是我们知道在父类出现的时候,子类可以出现,所以我们把gun对象申明为Gun类型,就可以吧任何Gun的子类型放入,但是子类的效果怎样呢?输出分别是:Gun shot
Pistol shot Rifle shot,子类工作的很好!这是为什么呢?其实,java的方法存放在代码区,父类的shot方法存在那里,子类的重写shot方法也存放在那里,当你重写父类的方法时,子类内部会指向子类实现的那个shot方法,也就是说,会根据当前对象的种类去执行相应的方法。

 

其实这里的Gun类可以换成抽象类或者接口,假设我们用接口的话。当子类实现了Gun的shot方法,我们用接口的引用对象访问实现类时,这引用会暴露实现类所实现的方法,从而进行操作。同时当我们需要新加入一种新武器RPG的时候,只需要让RPG实现Gun接口,在Gun出现的地方,RPG都可以出现,我们只需定义RPG这个类即可。

 

以上就是一点愚见,是很浅显的理解,还有很长的路要走啊!

java笔记多态性