生活中的多态:一个事物有多种称呼
程序中的多态:父类的类型 引用子类的对象。
//创建一个Person对象,用一个引用类型引用这个对象
//引用类型是Animal 是Person的父类 ,引用的是子类Person的对象
//多态
Animal p = new Person();
//多态
Object p2 = new Person();
多态体现了对象类型的灵活性
多态写法的注意事项
1. 多态的写法,只能调用父类的方法,不能调用子类独有的方法。
在编译期,编译器认为这个对象是引用的类型的对象;在运行期,就是实际的对象
//在编译期系统认为,这个对象是Animal类型,如果调用 Person独有的方法,编译不同过
//在运行期执行的方法 就是实际对象执行的方法
Animal p = new Person();
//错误
p.showInfo();
//Person对象的eat方法,也就是重写的方法
p.eat();
2. 多态的写法,如果调用子类独有的方法,对对象进行类型转换,转换成子类的类型
//创建一个Person对象,用一个引用类型引用这个对象
//引用类型是Animal 是Person的父类 ,引用的是子类Person的对象
Animal p = new Person();
//编译期通过 Person person = (Person)p;
person.showInfo();
//编译期通过
((Person)p).showInfo();
转型有风险,可能会出现转型异常。向上转型是没问题的,其他情况出现ClassCastException
3. 使用instanceof关键字 获得某个对象是否是属于某个类型的,如果属于则转型,否则不转型,避免转型异常 的发生
语法:
对象 instanceof 类型
返回true/false
4. instanceof 应用
public class LianHuan {
//中国人、英国人、印度人表演节目
public void play(Person p) {
if(p instanceof Chinese) {
Chinese c = (Chinese)p;
c.kongfu();
}
if(p instanceof English) {
English e = (English)p;
e.dance();
}
if(p instanceof India) {
India i = (India)p;
i.motuo();
}
}
public static void main(String[] args) {
Chinese c = new Chinese();
English e = new English();
India i = new India();
LianHuan lianhuan = new LianHuan();
lianhuan.play(c);
lianhuan.play(e);
lianhuan.play(i);
}
}