一、概述
多态是继封装、继续以后,面向对象的第三大特征。
生活中,比方跑的行动,小猫、小狗和大象,跑起来是不一样的。再比方飞的行动,昆虫、鸟类和飞机,飞起来也是不一样的。可见,统一行动,经由历程差别的事物,能够表现出来的差别的形状。多态,形貌的就是如许的状况。
多态:
是指统一行动,具有多个差别表现情势。
条件【重点】
1.继续或许完成【二选一】
2.要领的重写【意义表现:不重写,无意义】
3.父类援用指向子类对象【花样表现】
免费在线进修视频引荐:java视频
二、多态的表现
多态表现的花样:
父类范例 变量名 = new 子类对象; 变量名.要领名();
父类范例:指子类对象继续的父类范例,或许完成的父接口范例。
代码以下:
Fu f = new Zi(); f.method();
当运用多态体式格局挪用要领时,起首搜检父类中是不是有该要领,假如没有,则编译毛病;假如有,实行的是子类重写后要领。
代码以下:
定义父类:
定义子类:
定义测试类:
三、多态的优点
现实开发的历程当中,父类范例作为要领情势参数,通报子类对象给要领,举行要领的挪用,更能表现出多态的扩大性与方便。
代码以下:
定义父类:
定义子类:
定义测试类:
public class Test { public static void main(String[] args) { // 多态情势,建立对象 // Cat c = new Cat(); // Dog d = new Dog(); // 挪用showCatEat showCatEat(c); // 挪用showDogEat showDogEat(d); /* 以上两个要领, 均能够被showAnimalEat(Animal a)要领所替换而实行结果一致 */ showAnimalEat(c); showAnimalEat(d); } public static void showCatEat(Cat c) { c.eat(); } public static void showDogEat(Dog d) { d.eat(); } public static void showAnimalEat(Animal a) { a.eat(); } }
当eat要领实行时,多态划定实行的是子类重写的要领,那末结果天然与showCatEat、showDogEat要领一致, 所以showAnimalEat完全能够替换以上两要领。
不仅仅是替换,在扩大性方面,不管以后再多的子类涌现,我们都不须要编写showXxxEat要领了,直接运用showAnimalEat都能够完成。
所以,多态的优点表现在能够使顺序编写的更简朴,并有优越的扩大。
四、援用范例转换
多态的转型分为向上转型与向下转型两种:
向上转型
向上转型:多态自身是子类范例向父类范例向上转换的历程,这个历程是默许的。
当父类援用指向一个子类对象时,就是向上转型。
运用花样:
父类范例 变量名 = new 子类范例(); 如:Animal a = new Cat();
向下转型
父类范例向子类范例向下转换的历程,这个历程是强迫的。
一个已向上转型的子类对象,将父类援用转为子类援用,能够运用强迫范例转换的花样,就是向下转型。
运用花样:
子类范例 变量名 = (子类范例) 父类变量名; 如 :Cat c =(Cat) a;
转型演示,代码以下:
定义类:
定义测试类:
转型的非常
转型的历程当中,一不小心就会碰到如许的问题,请看以下代码:
这段代码能够经由历程编译,然则运行时,却报出了ClassCastException,范例转换非常!这是由于,明显建立了Cat范例对象,运行时,固然不能转换成Dog对象的。这两个范例并没有任何继续关联,不符合范例转换的定义。
为了防止ClassCastException的发作,Java供应了 关键字,给援用变量做范例的校验。
花样以下:
变量名 instanceof 数据范例 假如变量属于该数据范例,返回true。 假如变量不属于该数据范例,返回false。
所以,转换前,我们最好先做一个推断,代码以下:
想进修更多相干教程请接见:java入门进修
以上就是java面向对象——多态的细致引见的细致内容,更多请关注ki4网别的相干文章!