日期:2014-05-20  浏览次数:20639 次

父类引用子类的实例的真正好处是什么
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(),这样就可以让你在以后维护代码的时候,也就是扩展时,能够更方便,更清晰!
------解决方案--------------------
探讨
非常感谢大家的回复,我可能表达的不太清楚,我所说的想简明扼要并不是说想得到像20楼这样说的“实现多态,增强程序可拓展性,减少程序员代码量”这种答案,这样说有些太简明了,比如这样写怎么可以增强程序的扩展性,怎么可以减少程序员代码量。还是希望可以得到个更好的例子。

11楼说的可以减小耦合和可移植也不是很理解,希望能详细说下~~~

另外,我子类覆盖了你父类的方法,就应该算实现了多态吧,并不是……

------解决方案--------------------
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