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

请教一个向上转型的问题
public   class   AppTest
{

{
Shapes   fatcher   =   new   Circle();
fatcher.funA();
}

}


class   Shapes
{
public   void   funA()
{
funB();
}

public   void   funB()
{
System.out.println( "这是Shapes类的 ");
}
}

class   Circle   extends   Shapes
{
public   void   funB()
{
System.out.println( "这是Circle类的 ");
}
}


这里我调用
Shapes   fatcher   =   new   Circle();
fatcher.funA();
..这里子类Circle没有funA()方法,就调用的父类funA();那父类里面的funA方法.应该调用父类的funB(),为什么调用子类的funB()呢.
我现在对多态的理解还没有入门啊

------解决方案--------------------
这样理解应该容易理解一点
子类继承了父类的方法
除了重载外的方法 其余的方法只是没有写出来 但是记住子类仍然拥有这些方法

由于Shapes fatcher=new Circle();
创建的是Circle类的实例而非其父类的 所以要调用Circle类的方法
------解决方案--------------------
楼主说“子类Circle没有funA()方法,就调用的父类funA()”理解有误
子类Circle其实已经从父类那里继承了funA()
------解决方案--------------------
不要被楼上的误导。
这正是多态性实现的基础。虽然你声明的是Shape类,但是你得到的实例是Circle类的,所以方法调用都是针对Circle类的。而方法funA,因为是public方法,所以Circle类继承了它,又因为没有重写(override)funA,所以调用funA的时候调用的是完全继承自Shape的方法funA,它调用了funB;因为实例本身是Circle,所以调用了Circle的funB。
整个过程没有任何麻烦可言。