多态:一个对象具备多种形态。
说白点就是:父类的引用类型变量指向子类的对象或者接口的引用类型变量指向了接口实现类的对象。
多态的前提:必须存在集成或实现的关系。
多态注意的细节:
1、多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
2、多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员变量。
3、多态情况下,子父类存在同名的静态成员函数时,访问的是父类的成员函数。
4、类关系下的多态情况,不能访问子类的特有成员,除非强制类型转换。接口关系下的多天情况,可以访问任意的方法。
特别提醒:
编译看左边,运行不一定看右边。
编译看左边:java编译器在编译的时候,会检查引用类型变量所属类是否具备指定的成员,如果不具备会马上报错。
多态的应用:
1、多态用于形参类型的时候,可以接受更多类型的数据。
2、多态用于返回值类型的时候,可以返回更多的数据类型。
强制类型转换:
基本数据类型的转换:
小数据类型----->大数据类型 自动类型转换
大数据类型----->小数据类型 强制类型转换
格式:
小数据类型 变量 = (小数据类型)大数据类型;
引用数据类型的转换:
小数据类型----->大数据类型 自动类型转换
大数据类型----->小数据类型 强制类型转换
注意类型转换失败的常见异常: java.lang.ClassCastException
instanceof 关键字
作用:判断一个对象是否属于指定的类别。一般做强制类型转换之前都会使用该关键字先判断,然后在进行转换的。
使用前提:判断对象与指定的类别必须存在继承或者实现的关系。
使用格式:
对象 instanceof 类别
代码示例如下:
1 abstract class Shape{ 2 public abstract void getArea(); 3 public abstract void getLength(); 4 } 5 6 class Circle extends Shape{ 7 public static final double PI = 3.14; 8 double r; 9 public Circle(double r){ 10 this.r = r; 11 } 12 public void getArea(){ 13 System.out.println("圆形的面积:"+ PI*r*r); 14 } 15 16 public void getLength(){ 17 System.out.println("圆形的周长:"+ 2*PI*r); 18 } 19 20 public void circlePrint(){ 21 System.out.println("圆形。。。。。"); 22 } 23 } 24 25 class Rect extends Shape{ 26 int width; 27 int height; 28 public Rect(int width, int height){ 29 this.width = width; 30 this.height = height; 31 } 32 public void getArea(){ 33 System.out.println("矩形的面积:"+ width*height); 34 } 35 36 public void getLength(){ 37 System.out.println("矩形的周长:"+ 2*(width+height)); 38 } 39 40 public void rectPrint(){ 41 System.out.println("矩形。。。。。"); 42 } 43 } 44 45 class Demo{ 46 47 public static void main(String[] args){ 48 Circle c = new Circle(2.0); 49 print(c); 50 51 Rect r = new Rect(1,2); 52 print(r); 53 } 54 55 //定义一个函数可以接口任意类型的图像对象,并且打印图形的面值和周长和调用对象特有的方法。 56 public static void print(Shape s){ 57 //调用同名的方法 58 s.getArea(); 59 s.getLength(); 60 //调用特有的方法 61 if (s instanceof Circle) { 62 Circle c = (Circle)s; 63 c.circlePrint(); 64 }else if(s instanceof Rect){ 65 Rect r = (Rect)s; 66 r.rectPrint(); 67 } 68 69 } 70 }
在两种情况下存在多态:
1、类关系下的多态:
父类 变量 = new 子类对象。
以上代码都是类关系下的多态。
2、接口关系下的多态:
接口 变量 = new 接口实现类的对象。
接口关系下的多态和类关系下的多态用法一样。并且不用考虑特有函数的情况。