多态的概念

  • 多态主要指同一事物表现出来的多种形态

饮料:可乐 雪碧 红牛 脉动
宠物:猫 狗 鸟 小强
人:学生 教师 工人 保安
图形:矩形 圆形 梯形 三角形
多态的语法格式
父类类型 引用变量明=new 子类类型();
如:

  1. Shape sr =new Rect();
  2. sr.show();
  1. //编程实现Shape类
  2. package com.lagou.task08;
  3. /**
  4. * @author lijing
  5. * @date 2020/9/21 10:24
  6. * @description
  7. */
  8. public class Shape {
  9. private int x;
  10. private int y;
  11. public Shape() {
  12. }
  13. public Shape(int x, int y) {
  14. setX(x);
  15. setY(y);
  16. }
  17. public int getX() {
  18. return x;
  19. }
  20. public void setX(int x) {
  21. this.x = x;
  22. }
  23. public int getY() {
  24. return y;
  25. }
  26. public void setY(int y) {
  27. this.y = y;
  28. }
  29. public void show(){
  30. System.out.println("x:"+x+",y:"+y);
  31. }
  32. }
  1. //矩形类继承shape类
  2. package com.lagou.task08;
  3. /**
  4. * @author lijing
  5. * @date 2020/9/21 10:25
  6. * @description
  7. */
  8. public class Rect extends Shape{
  9. private int len;
  10. private int wid;
  11. public Rect() {
  12. }
  13. public Rect(int x, int y, int len, int wid) {
  14. super(x, y);
  15. this.len = len;
  16. this.wid = wid;
  17. }
  18. public int getLen() {
  19. return len;
  20. }
  21. public void setLen(int len) {
  22. if(len>0) {
  23. this.len = len;
  24. }else{
  25. System.out.println("长度不合理");
  26. }
  27. }
  28. public int getWid() {
  29. return wid;
  30. }
  31. public void setWid(int wid) {
  32. if (wid > 0) {
  33. this.wid = wid;
  34. }else{
  35. System.out.println("宽度不合理");
  36. }
  37. }
  38. }
  1. package com.lagou.task08;
  2. /**
  3. * @author lijing
  4. * @date 2020/9/21 10:29
  5. * @description
  6. */
  7. public class ShapeRectTest {
  8. public static void main(String[] args) {
  9. //1.声明shape类型的引用指向Shape类型的对象并打印
  10. Shape s1=new Shape(1,2);
  11. //当Rect类中没有重写show方法,下面调用shape类中的show方法
  12. s1.show();
  13. System.out.println("------------------");
  14. //2.声明Rect类型的引用指向Rect类型的对象并打印特征
  15. Rect r1=new Rect(3,4,5,0);
  16. //当Rect类中没有重写show方法,下面调用shape类中的show方法
  17. r1.show();
  18. System.out.println("------------------");
  19. //3.声明Shape类型的引用指向Rect类型的对象并打印特征
  20. Shape sr=new Rect(7,8,9,10);
  21. //当Rect类中没有重写show方法,下面调用shape类中的show方法
  22. sr.show();
  23. }
  24. }
  25. ------------------------------
  26. x:1,y:2
  27. ------------------
  28. x:3,y:4
  29. ------------------
  30. x:7,y:8

Rect类重写show方法的使用

  1. @Override
  2. public void show() {
  3. super.show();
  4. System.out.println("长度为:"+len+",宽度为:"+wid);
  5. }
  6. 结果
  7. x:1,y:2
  8. ------------------
  9. x:3,y:4
  10. 长度为:5,宽度为:0
  11. ------------------
  12. x:7,y:8
  13. 长度为:9,宽度为:10
  14. Process finished with exit code 0

多态的特点

  • 当父类类型的引用指向子类类型的对象时,父亲类型的引用可以调用父类独有的的方法
  • 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用子类独有的方法
  • 对于父子类都有的非静态方法拉说,编译阶段调用父类版本,运行阶段调用子类重写的版本(动态绑定)
  • 对于父子类都有静态的方法来说,编译和运行阶段都调用父类版本

    引用数据类型之间转换的方式

    多态 - 图1

  • 引用数据类型之间的转换方式有两种:自动类型转换和强制类型转换

  • 自动类型转换主要指小类型想大类型的转换,也就是子类转为父类,也叫作向上转型
  • 强制类型展缓主要指大类型向小类型的转换,也就是父类转为子类,也叫作向下转型或显式类型转换
  • 引用数据类型之间的转换必须发生在父子类之间,否则编译错误

    引用数据类型转换的注意事项

  • 若强转的类型并不是该引用真正指向的数据类型时则编译通过,运行阶段发生类型转换异常

  • 为了避免发生上述错误,应该在强转之前进行判断,格式如下:

if(引用变量 instanceof 数据类型)
判断引用变量指向的对象是否为后面的数据类型
多态 - 图2

多态的实际意义

多态 - 图3
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果