哪里有什么CLASSPATH的问题,呵呵.
楼主,为什么你觉得M没有问题?你的Homer就定义了这两个方法:
<<
char doh(char c)
float doh(float f)
>>
但是你的d.boh(m)确是: doh(Homer m) ,能不出错才是怪事.

解决方案 »

  1.   

    xiaohaiz(老土进城,两眼通红) 果然是高手中的高手!佩服!因为在Homer类中只定义的两个方法char doh(char c);float doh(float f);
    在它的子类Bart中,只是重写了(override) float doh(float f)方法,而public void doh(M m)方法并不是重写Homer类中的方法,而是重载(overload)本类中的float doh(float f)所以楼主可能是以为虽然定义了Homer类的变量,但实际指向Bart类,所以就可以调用Bart类中的方法。但是你调用的public void doh(M m)方法并不是重写父类的方法,只有重写父类的方法才可以这么做。正如xiaohaiz(老土进城,两眼通红)所说的那样,Homer类里并没有public void doh(M m)的定义,所以会出现参数错误。
      

  2.   

    补充一下:
    Bart a = new Bart();
    Homer b = a;
    虽然a和b都是指向同一个Bart对象,然而你使用a时,把该对象当成一个Bart对象,a可以实现所有Bart类的方法以及Bart类父类的方法。而你在使用b时,把该对象当成一个Homer对象,所以他只能完成Homer类的方法和Homer类的父类的方法。在Design Patterns Explained一书中,提到了一个词“责任”,这个词很好的描述了面向对象设计中的一个概念,就是一个类何以为一个类(我是谁的问题)。如果用“责任”这个概念来确定一个类,那么这个类所有实现的方法(接口)就是这个类的责任,而这个类的具体实现就是完成这个“责任”的具体操作方法。所以即使是同一个对象,如果你只把它当成Homer对象,那么它就会只完成Homer的“责任”了。(你可以说它偷懒,但谁让你不把它当成Bart对象呢?:P)