多态意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应不同的属性和方法。
具体来说就是指在继承过程中父类及子类中可以有多个同名但意义或实现方式不同的属性或方法,也就是重载和覆盖。在实际的应用中,还有两种特殊情形:向上转型和向下转型。
所谓向上转型即是声明父类变量后却在实例化时创建一个子类的实例。
首先先创建父类User与子类Student如下。其中子类中覆盖了父类的name变量与重写了print方法。新增了变量a与方法t。
在main函数中进行验证
代码解释:
第4行声明了一个User类型的变量s1,但是实例化的时候却实例化为Student类型。这种情况称为向上转型。s1非常特殊,他在编译时为User类型,而运行时却是Student类型。
实例s1可以访问父类User的成员变量,但是不能访问子类Student的成员变量。
实例s1可以访问父类User的方法,不能访问子类新增的方法。但是如果子类中有重写父类的方法时,实例s1调用此方法时调用的是子类的方法。
向下转型与向上转型相反,向下转型是先声明一个父类变量然后在实例化时创建一个子类的实例,接着使用强制类型转换转换为子类的引用。(现在看来也许很是多余,我想要使用子类对象直接实例一个子类实例多好,但是在java泛型的编程中,其用处很大)
接下来举一个简单例子
如图,实例c是c1父类变量但是实例化时实例化的c2子类,其只能访问父类方法m1()。
第6行使用强制转换后可以对子类方法m2方法进行访问。
注意:向上转型总是成功的,而且是系统自动类型转换的,向上转型表明子类是一种特殊的父类。但是向下转型考虑到要进行强制类型转换,所以很可能产生异常,因此在类型转换之前可以先用instanceof运算符来判断是否可以类型转换。
instanceof运算符用来判断一个操作数是否属于某种数据类型,如果属于这种数据类型返回true,否则返回false,其语法格式如下:
变量 instanceof 数据类型
举个简单的例子:
Object s=”ss”;
boolean b=s instanceof Long;
b的值为false,因为String类型不是Long类型。
其中Object类在java中是所有类直接或间接的父类。