class A{
}
class B extends A {
}
向下转型:
A a = new B();
B b = (B)a;
直接调用子类:
B b = new B();
这两个 b 实例 有什么区别
实现的功能没有区别。但是维护起来就不如第一个。
第一个是父类引用指向之类对象。可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的。让你更关注父类能做什么,而不去关心子类是具体怎么做的,你可以随时替换一个子类,也就是随时替换一个具体实现,而不用修改其他.
完全没有区别。
使用上是没有区别的。
只是涉及到设计上的一些问题而已。
第一点:
传统的面向对象编程是一个纵向的继承的过程。
所以= 左边的都是父类对象,右边是子类的。可以达到多态效果。
第二点:
程序中往往传入的参数需要进行具体类型的重塑
比如泛型模板 List往往传入具体的类的时候需要进行这个 instanceof 判断之后再进行转型
或者是反射的时候生成的对象需要进行这个转型
其他的情况是不需要进行这种转型的。