【威哥说】王健林一句话,刷爆了朋友圈。“先定一个能达到的小目标,比方说我先挣它一个亿”。好吧,也许咱们没有那样的霸气,至少咱们能够实现这样“先定一个能达到的小目标,比方说学会多态”。 【正文】今天带你们深刻理解面向对象的三大特征之一多态。java
多态:同一事物的多种形态。 首先我们举几个例子来讲明多态的概念。话说威哥儿子leo比较喜欢小动物,因此家里养了小猫,小狗和乌龟。我们学了继承关系,因此若是有分析的话须要四个类: 共同的父类:Pet(宠物)
abstract class Pet{微信
abstract void run();测试
}code
针对小狗咱们会有一个狗类,来继承宠物类,并重写run的方法:
class Dog extends Pet{对象
void run() {继承
}接口
}class
此时咱们根据以前面向对象知识,若是说建立一个狗类的话写法是:
Dog d = new Dog();变量
也就是声明一个狗类型的变量,并经过构造方法完成初始化,如今咱们能够说有一只小狗叫作d;如今看着迎面跑来的这个小狗,威哥笑着对leo说:“leo,你的小宠物跑来了”。注意这里的重点,你的小宠物跑过来了,你的小宠物,对,你没看错,是小宠物,那么我们这个现实生活中的逻辑在代码里一样是通的,具体表现为:
Pet d = new Dog();扩展
也就是说,咱们有一只狗,咱们也能够叫作小宠物,专业叫法叫作:
父类引用指向子类对象
那有人说这个怎么跟多态能扯上关系,简单点理解就是一个对象,多种形态,左边是一种宠物形态,右边是一个狗形态,这不就是多态么。 理解了多态的概念,那么我们看看在程序中多态具体体如今那些方面: 一、对象的多态性: 咱们看看对象的多态性如何引伸出来。 如今咱们要调用的话就是,在测试类中直接定义run方法,传入Dog类型的参数,而后在主方法中建立Dog对象,直接调用run方法,传入dog,具体代码以下:
public static void main(String[] args) {
Dog dog = new Dog();
run(dog);
}
public static void run(Dog dog){
dog.run();
}
如今我又多了一个猪类: 猪类:
class Pig extends Pet{
void run() {
}
}
此时猪受宠了,leo又想看猪蠢萌的跑法了,那么此时又得定义
public static void main(String[] args) {
Dog dog = new Dog();
run(dog);
Pig pig = new Pig();
run(pig);
}
public static void run(Dog dog){
dog.run();
}
public static void run(Pig pig){
pig.run();
}
而后在main方法中建立Pig对象,而后调用run方法将pig对象传入进去。 哎,此时我们帅气的leo小男神看了龟兔赛跑,又想看乌龟跑了,那么此时得建立一个乌龟类: 乌龟类:
class Tutle extends Pet{
void run() {
}
}
一样的,须要调用的话,又得写一个方法,传入乌龟的参数类型,具体以下:
public static void main(String[] args) {
Dog dog = new Dog();
run(dog);
Pig pig = new Pig();
run(pig);
Tutle tutle = new Tutle();
run(tutle);
}
public static void run(Dog dog){
dog.run();
}
public static void run(Pig pig){
pig.run();
}
public static void run(Tutle tutle){
tutle.run();
}
此时咱们发现run方法是大量的重复,并且处理都是直接调用run方法,那么我们以前也说了父类引用能指向子类对象,那么我们就能够直接来个升级版:
public static void run(Pet pet){
pet.run();
}
此时,无论你传入狗仍是猪仍是乌龟,均可以直接调用抽取出来的run方法,由于咱们说了不管是狗,乌龟,仍是猪都属于宠物类型,均可以直接
public static void main(String[] args) {
Dog dog = new Dog();
run(dog);
Pig pig = new Pig();
run(pig);
Tutle tutle = new Tutle();
run(tutle);
}
此时结构就很明朗了,那么此时咱们显而易见的是咱们能够总结出扩展的好处了: a) 提高了代码的复用性; 而且,咱们还有一点就是,若是后边leo又准备买一只兔子,那么咱们能够直接使用run方法,建立兔子对象传入便可,因此,此处还有第二个好处: b) 提升了代码的扩展性,前面定义的结构利于后边使用。 固然,针对接口也是同样的,上面的父类指父类结构,包括父类和父类接口。 二、方法的多态性 方法的多态性包括方法的重载,方法的重写等。一样也是一个事物多种形态的体现。 此处咱们简单跟你们总结一下重载和重写的概念: 重载:同一类中,方法名相同,参数列表不一样,返回值类型不能做为重载的判断条件 重写:子父类中,方法名相同,参数列表相同,返回值相同,子类重写的权限要不小于父类方法的权限,子类中抛出的异常不能大于父类中抛出的异常。
更多内容关注微信公众号mjw-java或访问www.moliying.com