问一下,对于继承中的多态的问题,例如下面的例子:
class Emp{
  private int age=0;
  public int getAge(){
    return age;
  }
  public void setAge(){
    age=10;
  }
}public class Man extends Emp{
  public int getAge(){
    return super.getAge()*2;
  }
  public String getName(){
    return "abc";
  }  public static void main(String[] args){
    Emp obj=new Man();
    obj.setAge();
    System.out.println("getAge()="+obj.getAge());
    System.out.println("getName()="+obj.getName());
  }
}
Man类继承了Emp类,并且重写了getAge()方法,添加了自己的新方法getName(),那么当我用父类Emp的引用指向子类Man的对象时,在调用getAge和getName方法时,编译器到时会根据具体对象的类型来调用子类中重写了的getAge方法,但是却不会调用子类中添加的方法getName,还会报错,大概就是说父类中没有这个方法的定义。
  那么我想问使用这种父类的引用指向子类的对象有什么好处,因为子类中独有的方法在这种方式下根本不能被调用,而在好多地方甚至把对象声明为接口类型,
例如java.util.set aSet=new java.util.HashSet();那么会不会出现同样的问题?

解决方案 »

  1.   

    Emp obj=new Man();
    父类的引用指向子类的对象,这样obj会先调用Man中的函数,而如果是Emp obj=new Emp()的话,obj调用的则是Emp中的函数。
    “因为子类中独有的方法在这种方式下根本不能被调用”
    如果想调用子类中新添加的方法,则必须这样Man m=new Man();
      

  2.   

    楼主还没有理解好什么是多态,用一句话总结一下就是"一种定义,多种实现",请先弄明白虚拟函数是怎么工作的(虚拟方法表和动态邦定),再好好理解abstract class and interface的作用至于设计模式现在看还言之过早