概念:父类引用指向子类对象。
举例:Animal a =newBird();
注意:1>二者之间必须有继承关系。
2>父类引用只能调用父类中定义的属性和方法,不能调用子类独有的属性和方法。
多态中的方法覆盖:
子类覆盖父类方法,使用父类引用调用,执行的是覆盖后的。
多态的应用:1>使用父类作为方法的形式参数:能够接受到的参数类型子类对象+本身类型对象
2>使用父类作为方法的返回值类型:能够返回的参数类型子类对象+本身类型对象
多态的好处:
可以把不同的子类对象都当做父类类型来看待,从而屏蔽不同子类对象之间的实现差异。
publicclassVehicle{privateint speed;// 速度publicintgetSpeed(){return speed;}publicvoidsetSpeed(int speed){this.speed = speed;}publicvoidrun(){
System.out.println("这个车正在以每小时"+ speed +"公里前进....");}}publicclassCarextendsVehicle{private String color;public String getColor(){return color;}publicvoidsetColor(String color){this.color = color;}publicvoidrun(){
System.out.println("这个"+ color +"的跑车正在以每小时"+getSpeed()+"公里前进....");}}publicclassBusextendsVehicle{privateint seatnum;//座位数publicintgetSeatnum(){return seatnum;}publicvoidsetSeatnum(int seatnum){this.seatnum = seatnum;}publicvoidrun(){
System.out.println("这个"+seatnum+"个座位的公交车正在以每小时"+getSpeed()+"公里前进....");}}publicclassBicycleextendsVehicle{private String brand;public String getBrand(){return brand;}publicvoidsetBrand(String brand){this.brand = brand;}publicvoidrun(){
System.out.println("这个"+ brand +"品牌的自行车正在以每小时"+getSpeed()+"公里前进....");}}publicclassEmployee{private String name;public String getName(){return name;}publicvoidsetName(String name){this.name = name;}//多态:场景一使用父类作为形式参数publicvoidgoHome(Vehicle v){
System.out.println(name+"正在乘坐");
v.run();}//多态:场景二使用父类作为返回值类型public Vehicle buyVehicle(int money){
Vehicle v;if(money <=2){
Bicycle bc =newBicycle();
bc.setBrand("捷安特");
bc.setSpeed(50);
v = bc;}elseif(money <=100){
Car c =newCar();
c.setColor("粉色");
c.setSpeed(20);
v = c;}elseif(money <=500){
Bus b =newBus();
b.setSpeed(90);
b.setSeatnum(30);
v = b;}else{
v = null;}return v;}}
向上、向下转型
Animal a =newBird();//向上转型:父类引用中保存真实子类对象
Bird d =(Bird)a;//向下转型:将父类引用中保存的真实类型强转回本身类型
Cat c =(Cat)a;//ClassCastException:类型转换异常publicclassAnimal{publicvoideat(){
System.out.println("动物吃饭");}}publicclassBirdextendsAnimal{publicvoideat(){
System.out.println("猫吃鱼");}publicvoidfly(){
System.out.println("鸟儿飞在空中飞翔");}}
instanceof 关键字
语法:引用 instanceof 类型
作用:判断引用中保存的真实类型,返回true或false。
好处:避免强转出现错误。
publicstaticvoidmain(String[] args){
Animal a =newBird();if(a instanceofBird){
Bird b =(Bird)a;
b.fly();}elseif(a instanceofCat){
Cat c =(Cat)a;
c.eat();}}