Java 多态性(向上转型、向下转型)

(1) 方法的多态性:重载、覆写;

(2) 对象的多态性:父子类对象的转换;

        向上转型:子类对象变为父类对象,父类 父类对象 = 子类实例,自动转换;

        向下转型:父类对象变成子类对象,子类 子类对象 = (子类) 父类实例,强制转换;

class A{
  public void print(){
    System.out.println("A");
  }
}
class B extends A{              //继承A类
  public void print(){          //方法覆写
    System.out.println("B");
  }
}
public class Main{
  public static void main(String arg[]){
    A a = new B();            //向上转型
    a.print();                //调用覆写的方法
  }
}

运行结果:B

本程序是一个对象向上转型,虽然对象调用对象的,但实例化的是子类对象,并且print()方法被子类覆写了,最终调用的是B类覆写的print()方法;方法的是A类的,但实例化的是子类对象,并且print()方法被子类覆写了,最终调用的是B类覆写的print()方法;

public class Main{
  public static void main(String arg[]){
    A a = new B();            //向上转型
    B b = (B)a;               //向下转型
    b.print();                
  }
}
运行结果:B

对象向下转型,本程序强制将父类对象变为了子类实例,由于本程序开始实例化的依然是子类对象( new B() ),最终调用的方法仍然是被覆写的print()方法。

public class Main{
  public static void main(String arg[]){
    A a = new A();            //没有转型
    B b = (B)a;               //向下转型
    b.print();                
  }
}

运行结果:Exception in thread "main" java.lang.ClassCastException: A cannot be cast B

程序编译时未发生任何错误,但执行时发生ClassCastException错误提示,表示类转换异常;

所以:当对象发生向下转型关系前,一定要首先发生对象向上转型关系


在发生向下转型操作前可以先判断一下再转型,使用instanceof关键字

对象 instanceof 类  → 返回Boolean型

例:a instanceof A;//返回true

实际情况中,向下转型使用的较少;

向上转型,主要用于统一参数,父类代表所有子类作为方法参数,此时子类不能扩充父类方法;


为了操作的方便,尽量不要向下转型操作,也尽量不要扩充方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值