面向对象之多态的个人理解:
以前学习的定义一个变量都是指向本类的,如 本类数据类型 变量名= new 本来数据类型();而多态是父类类型 变量名=new 子类类型 ();也就是给父类类型定义一个子类类型的值,这样就既能调用子类的方法,又能调用父类的方法了。当然前提是二者存在继承或者实现关系;但是当子父类中出现成员变量和成员方法相同的现象时,对于成员变量:编译和运行都看左边(父类),而对于成员方法,则编译看左边(父类),运行看右边(子类),也就是说当出现一样的时候父类中都必须存在。
有关多态的转型,可以理解为当需要调用父类的功能时,使用向上转型(多态就是其中一种),当需要调用子类的特有功能时,则用到向下转型;但是由于父类型被继承的不一定就只有一个子类型,为了确定来自哪个子类型,就需要确定用instanceof 来确定具体来自哪个!需要注意的是向下转型需要在向上转型也就是多态的基础上才可以的。
多态:
一、概念:
多态体现为父类引用变量可以指向子类对象。
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
二、定义:
父类类型 变量名 = new 子类类型(); 变量名.方法名();
三、多态的成员特点:
成员变量:编译运行都看左边(父类);
成员方法:编译看左,运行看右(子类)。
四、instanceof 关键字
用instanceof关键字来判断某个对象是否属于某种数据类型(若是根本没关系的话,直接编译失败;编译成功可能为父元素的另外一个子元素)
五、多态-转型:
1、向上转型:
当有子类对象赋值给一个父类引用时,便是向上转型。-------多态本身就是向上转型的过程
父类类型 变量名 = new 子类类型();
2、向下转型:
一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。
在多态的基础上才可以的,也就是得先向上再向下的!
向下转型后调用对象和方法时,都是调用的子类的方法;也可以调用子类独有的普通方法。
子类类型 变量名 = (子类类型) 父类类型的变量;
六、多态的优劣:
1、什么时候用向上转型:
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。
2、什么时候用向下转型:
当要使用子类特有功能时,就需要使用向下转型。
向下转型的好处:可以使用子类特有功能。
弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。(有可能转到另外的一个子元素上,这时候就需要instanceof 判定下是不是所需要的数据类型)
Person p1 = new Student(); // 前提条件,学生类已经继承了人类 boolean flag = p1 instanceof Student; //flag结果为true boolean flag2 = p1 instanceof Teacher; //flag结果为false