先说概念,在Java中,向上转型指的是:将子类对象赋值给父类引用,例如:
代码语言:javascript代码运行次数:0运行复制 Animal animal = new Dog();这种操作在Java中非常常见,比如在面向接口编程时:
代码语言:javascript代码运行次数:0运行复制 List
而向下转型指的是:通过强转,将父类的引用(变量)转换成子类的引用(变量),以便我们调用子类特有的方法,例如:
代码语言:javascript代码运行次数:0运行复制 Animal animal = new Dog(); // 注意这里new的是dog类型对象
Dog dog = (Dog) animal;问题来了,既然已经知道需要一个子类的dog对象了,为什么不直接new一个子类对象呢?
答案还是面向接口编程,举个例子,在Spring框架中,我们经常自动注入一个接口或抽象类:
代码语言:javascript代码运行次数:0运行复制 @Compoment
public Class example{
@Autowired
@Qualifier("dog") // 注入dog实现
private Animal animal;
public void test(){
animal.speak(); // 实际注入的是dog类
}
}
输出:汪汪汪!
其实这样做的原因是,有时候我们不知道该使用哪种实现,有时候一个功能接口可能有多种实现,比如支付功能有微信支付和支付宝支付,为了符合面向接口编程的思想,降低耦合度,可以先统一创建一个父类对象,然后再进行强转,这样就增加了我们代码的的解耦性、扩展性和复用性。
另外,要特别注意的一点,所谓的“强制转换”,并不是把一个类型的对象转换成另一个类型的对象,只是改变了引用的类型,并没有改变对象本身的类型!
一个对象的类型在new时就已经确定了,永远不可能改变!!!
比如下面的代码会报出ClassCastException异常:
代码语言:javascript代码运行次数:0运行复制 Animal animal = new Animal();
Dog dog = (Dog) animal(); // 报错,