class SuperBase{ void print(SuperBase a){System.out.print("super");}}
class Base extends SuperBase{ void print(Base b){System.out.print("Base");}}
class Derived extends Base{ static void print(Derived c){System.out.print("Derived");}}public class Test7{
public static void main(String[] args){
SuperBase a1 = new SuperBase();
SuperBase b1 = new Base();
Base c1 = new Derived();
a1.print(new Base());
b1.print(new Derived());
c1.print(new Derived());
}
}谁能帮我解释一下为什么这段代码运行的输出是“supersuperBase”类Base中的print方法是override了父类中的print方法吗?谢谢!

解决方案 »

  1.   

    看清楚,SuperBase b1 = new Base();你自己父类引用了子类实体,输出父类方法
      

  2.   

    这不是覆盖(override)这是函数重载(overload),举个例子
    class Base extends SuperBase{ 
    void print(Base b){
    System.out.println("Base "+b.toString());
    }
    }
    其实重载后应该是
    class Base extends SuperBase{ 
    void print(SuperBase a){
    System.out.println("super "+a.toString());
    }
    }
    void print(Base b){
    System.out.println("Base "+b.toString());
    }
    }
    你以SuperBase为参数肯定是调用void print(SuperBase a)这个函数,这并不是多太问题。
      

  3.   

    调用哪个就你上面写的主要看a1,b1,c1是哪个类
    还有写代码一般不会像你这样的,估计只有教科书才会有这种代码
      

  4.   

    这个当然不是我写的代码啦。是一个考试题。b1应该是Base类的一个实例,然而在这里b1.print(new Derived());它却调用了SuperBase类里面的方法。我的问题是它为何不调用自己的那个print方法?
      

  5.   

    如果我把代码稍微改一下:class SuperBase{ void print(Base a){System.out.print("super");}}
    class Base extends SuperBase{ void print(SuperBase b){System.out.print("Base");}}其余的不变。 那么这里b1.print(new Derived());仍然调用了SuperBase类里面的方法why ???
      

  6.   

    如果我把代码稍微改一下:class SuperBase{ void print(Base a){System.out.print("super");}}
    class Base extends SuperBase{ void print(SuperBase b){System.out.print("Base");}}其余的不变。 那么这里b1.print(new Derived());仍然调用了SuperBase类里面的方法why ???
      
    //********************************************************
    关键是看b1是superbase 类吧,所以调用superbase 的print吧,然后用子类实例化父类作参数,我也是初学,等你明白了,我也学习
    呵呵
      

  7.   

    正确的解释是这样的:
    子类对象赋给父类句柄后,该句柄不能访问子类的那些特殊属性和方法,就是那些没有在父类中定义过得方法和属性。所以那里总是调用父类那个方法了,Base类中的那个print方法永远也不会被调用。这里的b1是Base类的一个实例的引用,它调用的print方法是从SuperBase那里继承过来的。而不是他自己的那个。
    因为平时我们遇到的一般都是子类对象赋给父类句柄后,然后调用那个已经在子类中覆盖了的方法,所以在这里也很容易误解为这里仍然调用子类中的方法。(惯性思维,呵呵) 
    问题已经解决,散分啦~
      

  8.   

    根本原因如:yczz(飞鸟) ( ) 信誉:100  2006-06-21 18:01:00  得分: 0  
    这不是覆盖(override)这是函数重载(overload) 
      

  9.   

    晕了~~~晕了~~~
    醒过来后本人认为关键在于(SuperBase b1 它是什么?):  SuperBase b1 = new Base();这里注意了,b1实际上是一个SuperBase类型的引用
    所以调用的是SuperBase的构造函数。(第二个Super的解释)
      同理可证(最后一个打印Base了,因为是Base类型的引用啊)
      第一个打印的Super是理所当然的啦类Base中的print方法的确是override了父类中的print方法,这点没有错。
      

  10.   

    我认为类Base中的print方法的没有override了父类中的print方法,因为方法签名不同。应该是函数重载。
      

  11.   

    问题关键在这两点上面:1) 这不是覆盖(override)这是函数重载(overload)
    2) 子类对象赋给父类句柄后,该句柄不能访问子类的那些特殊属性和方法