面向对象的三大特征:封装、继承、多态 多态 多态就是同一个对象,在不同时刻不同环境表现出来的不同形态。 多态的前提: 要具有继承关系(继承父类),或具有实现关系(实现接口)。 要进行方法的重写。 要【父类的引用指向子类的对象】 父类 对象名=new 子类(); 多态有什么好处? 定义方法的时候,可以使用父类类型作为参数,在使用的时候,使用具体的子类的对象作为实际参数进行操作。 class 食物{ } 汉堡、炸鸡、凉皮、米粉、米饭... class Person{ public void eat(食物 sw){ //在声明形式参数的时候,使用的父类类型的引用变量 } } Person p=new Person(); p.eat(new 汉堡()); //实际在调用方法并传递实际参数的时候,使用的是子类的对象。 p.eat(new 炸鸡()); p.eat(new 凉皮()); p.eat(new 米粉()); 多态有什么弊端? 不能使用子类特有的成员。解决方案:向下造型。 多态的转型: 向上转型 向上造型: 父类的引用指向子类的对象,就是向上造型 Animal a=new Cat(); 向下转型 向下造型: 子类类型 对象名=(子类类型)父类引用; Cat c=(Cat)a; //强行把父类的对象转化为子类 向下转型存在的风险和解决方案: 风险: 向下转型会带来一定的风险,如果对应的实际类型和目标类型不是同一种类型, 那么在转换的时候就会出现异常:ClassCastException类型强制转换异常 解决方案: 使用一个关键字 instanceof 使用的格式: 变量名(对象名) instanceof 类型 判断关键字左边的对象名,是不是右边的类型,如果是返回true,否则返回false。 if(c instanceof Cat){ Cat c=(Cat)a; }