public class Test2{
   
   public static void main(String[] args){
      Father  f = new Son();
      f.read();
      f.run();
      //Father f1 = new Father();//Father类是抽象类,无法对其进行实例化
      //f1. read();
      //f1.run();
      Son s = new Son();
      s.run();
      s.write();
      s.read();
   }
}abstract class Father{
           
   public void read(){
      System.out.println("father.read().");
   }
   
   public abstract void run();
}class Son extends Father{
 
   public void run(){
      System.out.println("son.run().");
   }
   
   public void write(){
     System.out.println("son.write().");
   }
} 为什么一定用Father  f = new Son();来实例化对象比较好啊?我觉得Son s = new Son();实例化方法更好,它不仅可以访问到子类自己的成员方法和重写父类的方法,还可以访问父类的方法,而Father  f = new Son();实例化方法不能访问到子类自己的方法呀,虽然第一种用的是多态思想,我看不出来它好在哪边?

解决方案 »

  1.   

    是为了增加daughter时,修改小一些。
      

  2.   

    你只写了一个子类是看不出什么效果的,
    打个比方,若一个父类下有多个子类,父类为交通工具,子类分别为车,船,飞机,
    人这个类里有一个启动的方法,需要的参数是这些交通工具,但启动的是车、船还是飞机,要看具体情况,
    若按你的思路,就要为每个子类写一个方法run(Car c),run(Plane p)...
    若使用向上转型,只需写一个方法run(Tools t)就可以了,
    这样只有在运行时刻才知道对象具体是哪一个类的,并不是在你写代码的时候就确定参数对象是哪一个类的。
    这样做可以实现代码复用,减少了重复工作,节省了劳动力。
      

  3.   

    假如有一个方法
    public void test(Father father){
       
    }
    原来你直接传递的Son类型的对象,没有问题;但是后来由于某些原因,你想不用Son 类型的对象了,而其他类型的对象如Daught类型的对象(Daughter要继承Father),那么上面的方法不用任何改动,只需要实现Daughter类即可。符合 设计模式中的  对修改封闭,对扩展开放  的原则,代码更灵活。定义使用接口或者抽象类的一个重要原因就是易于更换子类实现,而不修改参数,以统一的方式使用。往大了说就是规范,如Servlet规范(Servlet规范中基本全是接口,具体实现由各个web容器实现,如tomcat等,我们在使用的时候知道Servlet规范就可以)
      

  4.   

    不用去怀疑java的多态好处,而是怎么去用的问题,这说明你根本就没有深入的理解多态的含义.
      

  5.   

    这个程序其实是想用11楼所说的设计模式,也有点类似于简单工厂模式。
    即father类好比是一个工厂,son类好比是工厂生产的产品。这样做的好处是避免了大量代码的重复,在此例中即表现在所有的对象都有read()方法,但run()方法则可能不一样。
    跟你推荐一本书吧:大话设计模式,用大话西游的模式写的,有趣又有用
      

  6.   

    如果你要生成father就一定的那样,没有说你生成son用那样啊。
      

  7.   

    等你父亲再生个儿子的时候你就知道为什么“Father f = new Son();”更好了!!!
      

  8.   

    那种用法是面向对象程序设计中很重要的多态思想。你只继承了一个类,当继承的子类多一些的时候,会体现出来这样做的优越性。我也是新手,请问Father f = new Son();这样做应该也可以访问到子类自己的成员方法和重写父类的方法,还可以访问父类的方法吧