🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] # 多态 1. 多态主要指同一种事物表现出来的多种形态 >[danger] ##### 多态语法格式 ~~~ 父类类型 引用变量名 = new 子类类型(); ~~~ 例如 ~~~ Shape sr = new Rect() ~~~ >[danger] ##### 多态特点 1. 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用**父类独有的方法** 2. 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用**子类独有的方法** 3. 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类重写的版本(**动态绑定**) 4. 对于父子类都有的静态方法来说,编译和运行阶段都调用**父类版本** >[danger] ##### 案例 ~~~ 1.编程实现Shape类的封装,特征有:横纵坐标,要求提供打印所有特征的方法。 2.编程实现Rect类的封装并继承自Shape类,特征有:长度和宽度。 3.编程实现ShapeRectTest类,在main方法中分别创建Shape和Rect类型对象并打印特征。 ~~~ * 父类Shape ~~~ public class Shape { private int x; private int y; public Shape() { } public Shape(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public void show(){ System.out.println("横坐标"+getX()+"纵坐标"+getY()); } } ~~~ * 子类 ~~~ public class Rect extends Shape{ private int len; private int wid; public Rect() { } public Rect(int x, int y, int len, int wid) { super(x, y); this.len = len; this.wid = wid; } public int getLen() { return len; } public void setLen(int len) { if(len>0){ this.len = len; }else{ System.out.println("长度不能为负数"); } } public int getWid() { return wid; } public void setWid(int wid) { if(wid>0){ this.wid = wid; }else{ System.out.println("宽度不能为负数"); } } @Override public void show() { super.show(); System.out.println("长度"+getLen()+"宽度是"+getWid()); } } ~~~ * 运行入口 ~~~ public class ShapeRectTest { // 此时传入参数不一定是Rect 或者是Shape其他子类型,但如果类型写死需要 // 利用重载写多次对应类型,利用了多态此时一个入口方法即可 public static void getShow(Shape sr){ sr.show(); } public static void main(String[] args){ // 声明 Shape 类型 Shape shape = new Shape(1,2); shape.show(); System.out.println("---------------------"); // 声明 Rect 类型 Rect rect = new Rect(3,4,5,6); // 如果子类没有重写父类的show 方法此时用是父类show方法 rect.show(); System.out.println("---------------------"); // 声明 Shape 类型指向 Rect Shape sr = new Rect(7,8,9,10); // 如果子类没有重写父类的show 方法此时用是父类show方法 // 如果子类重写父类的show ,在编译阶段使用是父类show方法,在执行阶段执行的子类show方法 sr.show(); // 使用多态特性 ShapeRectTest.getShow(new Rect(7,8,9,10)); ShapeRectTest.getShow(new Shape(7,8)); } } ~~~ >[danger] ##### 多态意义 1. 多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果 2. 使用多态的格式,此时父类类型引用直接调用的所有方法一定是父类中拥有的方法,若以后更换子类时,只需要将new关键字后面的子类类型修改而其它地方无需改变就可以立即生效,从而提高了代码的可维护性和可扩展型。 ~~~ // 如果以后代码编写时候使用多态向上转型后,此时未来代码将要有改动更换类时候 // 只需将new 部分改动例如 Shape s = new Rect() 改 Shape s = new Clire(); 但下面的调用方法 // 无需更调用 或作为方法参时候去给改整体 Shape s = new Rect() s.getShow() ~~~ * 缺点 1. 父类引用不能直接调用子类独有的方法,若调用则需要强制类型转换