揭阳网站推广教程,兰州app定制开发,徐州市工程招标网,晋安网站建设#xff08;一#xff09;定义
官方#xff1a;多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口#xff0c;使用不同的实例而执行不同操作。
生活中的多态#xff0c;如图所示#xff1a; 多态性是对象多种表现形式的体现。 现实中#xff0c;…一定义
官方多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口使用不同的实例而执行不同操作。
生活中的多态如图所示 多态性是对象多种表现形式的体现。 现实中比如我们想做榨果汁这个动作 如果用的是橙子就会榨出橙汁 如果用的是西瓜就会榨出西瓜汁 如果用的是蜜柚就会榨出蜜柚汁 有一说一椰汁真的好喝简言之多态同一个事件发生在不同的对象上会产生不同的结果。 二多态的好处为什么需要多态怎么实现多态
1.好处意义
消除类型之间的耦合关系可替换性 可扩充性 接口性 灵活性 简化性
简言之多态使得代码的编写更灵活功能更强大。更专业的答案是可以实现虚方法的动态绑定 2.多态的实现方式 ① 重写 ② 接口 生活中的接口最具代表性的就是插座例如一个三接头的插头都能接在三孔插座中因为这个是每个国家都有各自规定的接口规则有可能到国外就不行那是因为国外自己定义的接口类型。java中的接口类似于生活中的接口就是一些方法特征的集合但没有方法的实现。 ③ 抽象类和抽象方法 3.多态的用处 有时候我们在设计一个数组、或一个成员变量、或一个方法的形参、返回值类型时无法确定它具体的类型只能确定它是某个系列的类型。 具体 ① 声明变量是父类类型变量赋值子类对象 方法的形参是父类类型调用方法的实参是子类对象 实例变量声明父类类型实际存储的是子类对象 ② 数组元素是父类类型元素对象是子类对象 ③ 方法返回值类型声明为父类类型实际返回的是子类对象
三多态现象发生的前提
1继承 2有多态引用 父类类型 变量 子类的对象; 变形 A父类的类型[] 数组名 new 父类的类型[长度]; 数组名[下标] 子类的对象; B形参的类型是父类的类型实参是子类的对象 C方法的返回值类型是父类的类型返回的实际结果是子类的对象 D某个成员变量声明的是父类的类型实际接收的是子类对象 总结父类类型的变量/元素中存储了子类的对象子类对象的首地址 3通过多态引用的父类类型的变量/元素“调用虚方法”虚方法可以被子类“重写”的方法。 如果通过多态引用的父类类型的变量/元素调用的是非虚方法或者是成员变量那么不用考虑多态的问题只看变量/元素的“编译时类型”。 具体代码
public class CShape {//当使用多态方式调用方法时首先检查父类中是否有该方法如果没有则编译错误如果有再去调用子类的同名方法。//多态的好处可以使程序有良好的扩展并可以对所有类的对象进行通用处理。void draw(){System.out.println(画形状);}}
class Circle extends CShape {//void draw(){System.out.println(画圆形);}}
class Square extends CShape {//void draw(){System.out.println(画矩形);}}class Trapezoid extends CShape {//void draw(){System.out.println(画梯形);}}public class TestCC {public static void main(String args[]){CShape shape new Circle();//向上转型shape.draw();Circle c(Circle)shape;//向下转型c.draw();;print(new Circle());print(new Trapezoid());}public static void print(CShape ccc ){ccc.draw();//它是啥类型if(ccc instanceof Circle){Circle c(Circle) ccc;c.draw();}else if(ccc instanceof Square){Square s(Square)ccc;s.draw();}else if(ccc instanceof Trapezoid ){Trapezoid t(Trapezoid )ccc;t.draw();}}
}四虚函数 虚函数的存在是为了多态。 Java 中其实没有虚函数的概念它的普通函数就相当于 C 的虚函数动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性可以加上 final 关键字变成非虚函数。
重写
我们将介绍在 Java 中当设计类时被重写的方法的行为怎样影响多态性。 方法的重写即子类能够重写父类的方法。
当子类对象调用重写的方法时调用的是子类的方法而不是父类中被重写的方法。
要想调用父类中被重写的方法则必须使用关键字 super。 五金科玉律 1面向对象的基本特征有哪些 封装、继承、多态 2面向对象的特征有哪些 封装、继承、多态、抽象 3多态现象 编译时看父类 运行时看子类 如果子类重写的了“虚方法”那么就一定执行的是重写后的代码。 如果子类没有重写“虚方法”那么还是执行父类中的方法体。 4变量/对象的类型 运行时类型就是new关键字后面出现的类型名从new出来之后就不会改变。
编译时类型可以变化的1当把对象赋值给一个父类变量/元素时就会像上转型为父类类型2当把对象“向下转型”为子类类型时就会转为子类类型3当然也可以手动的“向上转型”为父类的类型即(父类类型)子类对象也会转为父类类型
如果调用的是虚方法那么要关注的是对象的运行时类型。
如果调用的是非虚方法或者成员变量那么要关注的是对象的编译时类型。 5什么是编译时类型1.对于变量来说变量声明时左边的类型就是它的编译时类型2.对于强制类型转换来说()中写的类型是什么它的编译时类型就是什么。如果有连续多次的强制类型转换看最后一次。