父类引用子类的实例的真正好处是什么 B类继承A类,那么A a = new B(); 比 B b = new B(); 的好处在哪里?
B b = new B(); b可以调用 1)A类的没有被子类覆盖的方法 2)A类被子类覆盖的方法 3)B类特有的方法
而A a = new B();只可以调用 1和2,那么不直接用 B b = new B()呢?
例如我们一般都写List list = new ArrayList();而不用ArrayList list = new ArrayList();
最好不要把大片的理论给我贴上来,我想要简明扼要的,最好是结合自己实际项目中经验。
------解决方案-------------------- 举个更实际一点的例子吧,当用 IOC 容器,像 Spring 里管理 Bean 时,如果用父类或接口来引用子类的实例的话
A a = (A)factory.getBean("ab");
当在 spring 的配置文件中改变 ab 的实现类时,上面的代码完全可以不变。
------解决方案-------------------- 不必结合项目 A a = new B()不要只看这种声明啊,这就是向上转型, 其最大好处在于面向父类编程,在运行期实际运行子类代码 考虑System.out.println(Object obj); 为什么要设计为Object,你传一个new Dog的时候实际上就有"Object obj = new Dog()" JDK程序员没有办法为你的类编写print方法但是它可以面向顶层父类编程 又由于后期绑定,真正打印的是子类对象的toString()
简而言之,多态的特性在于继承重写、向上转型和后期绑定。 如果不用多态,随便你怎么声明,A a = new B()还是B b = new B()又有什么关系呢?
------解决方案-------------------- 很明显,在可维护性方面起到的作用是最大的! 例如你写了一段程序 下面:A a = new B(); B b = new B(); B继承与A,你在做开发写代码的时候,你就可以去考虑,B类那些对象可以不需要扩展,不需要使用自己的非继承覆盖方法时,你就可以直接使用 A a=new B(); 当你那些对象在以后功能的实现时需要扩展时功能时,你则可以使用B b=new B(),这样就可以让你在以后维护代码的时候,也就是扩展时,能够更方便,更清晰!
------解决方案--------------------
------解决方案--------------------
Java code
public abstract class User{
public abstract Power getPower();
}
public class Admin extends User {
public Power getPower() {}
}
public class Student extends User {
public Power getPower() {}
}
public class CheckPower {
public static boolean check(User user) {
}
}
//如果检查Power那里不用父类的话,有多少个子类就要定义多少个方法来检查Power