Java笔记 - 多态的相关概念及用一个案例了解多态的实际意义

#多态

一、概念

多态就是指同一种事物表现出来的多种形态。

例如:

整数: byte b = 10; short s = 10; int i = 10;

c++的多态可以分为两种:编译多态、运行时多态。而Java中的多态只有一种,就是运行时多态,是一种运行期间的行为,而不是编译期的行为。

二、语法格式

父类类型  引用   =  new 子类类型();

例如:

Person p = new Student();

p.show();

解析:在编译阶段p是Person类型,因此调用Person类自己的show()方法,若没有则编译的时候就会报错。

           在运行阶段p真正指向的对象是Student类型,因此最终调用的是Student类中自己的show()方法。

注:

(1)当使用多态方式调用方法的时候,首先会检查父类中是否有该方法,如果没有,则编译报错。

(2)如果有,再去调用子类的同名方法。(注意:静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只能起到隐藏的作用。)

三、多态存在的三个比较条件:(1)要有继承(2)要有重写(3)父类引用指向子类对象

四、多态的效果:

(1)对于指向子类对象的父类来说,在编译期间只能调用父类的方法,不能直接调用子类的方法。

(2)对于父子类都有的非静态方法来说,最终调用子类中的重写版本。

(3)对于父子类中都有的静态方法来说,最终调用父类中的版本,与指向的对象类型无关。

五、引用类型之间的转换

(1)引用类型之间的转换必须发生在父子类之间,分为自动类型转换(向上转换)和强制类型转换(向下转换)

(2)向上转换(子类类型向父类类型转换)

父类引用指向子类对象:Person p = new Student();

把一个子类对象转换为父类对象,向上转型(自动转型、隐式转型),代码中是父类引用指向子类的对象,父类引用指向类型实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法。

注:父类中的静态方法无法被子类重写,所以向上转型之后只能调用父类原有的静态方法。

(3)向下转换(父类类型向子类类型的转换)

子类引用指向父类实例,必须进行强制类型转换,可以调用子类特有的方法。

(4)当没有父子类关系发生强制类型转换则编译报错,当拥有父子类关系发生强制转换时编译通过。

         若目标类型并不是该引用真正指向的类型时,在运行阶段发生类型转换异常。

(5)为了避免上述情况发生,通常只要进行强制类型转换就需要进行判断,格式如下:

if(引用变量名  instanceof 数据类型){ }

- 判断引用指向的对象是否为指定的数据类型,若是则返回true,否则返回false。

下面用一个案例来了解多态的实际意义:

形状:横坐标、纵坐标

矩形:长度、宽度

圆形:半径

要求:写一个方法既能打印矩形又能打印圆形。

首先是形状类:封装,get、set方法,无参、有参构造

然后是矩形类:同样的封装,get、set方法,无参、有参构造,同时重写show方法

接着是圆形类:同样的封装,get、set方法,无参、有参构造,同时重写show方法

最后是测试类及控制台输出结果:注释掉的方法是分别调用矩形类和圆形类自己的show()方法,需要接收的对象数量比较少时可以这样来做,也能顺利完成,但接收对象数量十分庞大时,就需要用到多态了。通过编写这样一个案例,我们可以轻易看出合理运用多态可以提高效率,这也是多态的实际意义所在。

猜你喜欢

转载自blog.csdn.net/solitary__/article/details/97280354