java中的多态
同一个事物在不同时刻表现出来的不同状态。
多态不针对变量,只针对方法,
具体来说是运行结果只有成员方法会有差异,父类调用了子类的成员方法,
对于成员变量,静态变量,静态方法还是保留父类的不变
换句话说就是父类的一个操作放置到不同子类对象上产生不同的效果
所以特点就是:
- 父类具有这个功能或方法
- 子类有相同的方法,存在重写
//如果我的身份是老师
Teacher t = new Teacher(); //t是所谓的”事物“
//我同时也是一个人,从人的角度来考虑
Person p = t;//可以吗?可以。
//接下来从 p 的角度出发,就是身份的转变。
// 这就是所谓的多态。
Person p = new String();//可以吗?不可以 不兼容的数据类型
前提:必须有继承关系
体现: 往往有方法的重写。子类对象被父类对象所引用。
多态时成员变量的特点
【数据】多态时,编译看左边,运行看左边。
多态时成员方法的特点
【行为】多态时,编译看左边,运行看右边。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
总结
- 成员变量
- 编译看左边,运行看左边
- 成员方法
- 编译看左边,运行看右边
- 静态变量
- 编译看左边,运行看左边
- 静态方法
- 编译看左边,运行看左边
所谓的弊端:当我需要访问子类特有的行为时,必须向下转型
- 强转: 子类类型 变量名 =(子类类型)父类变量;
- 当两个类型不具备继承关系时,不能使用强转,就发生编译错误。
- 即使两个类有继承关系,如果它引用的对象不是某个子类,运行时也会发生异常:
- 为避免没有继承关系的两个类的强转可以利用关键字instanceof和if来进行判断
if(a instanceof _2b){ //如果a 是一个_2b类,则执行方法体 }
方法相关特点:
- 当父类型作为方法参数时,调用时可以传递 父类类型的对象或子类类型的对象(多态)。
- 当父类型作为方法返回值时,也可以返回 父类类型的对象或子类类型的对象(多态)。