class Base { public void foo(Base x)
{
System.out.println("Base.Base");
}
public void foo(Derived x)
{
System.out.println("Base.Derived");
}

}
class Derived extends Base
{
public void foo(Base x)
{
System.out.println("Derived.Base");
}
public void foo(Derived x)
{
System.out.println("Derived.Derived");
}

}
public class StaticParamsDemo
{
public static void whichFoo(Base arg1, Base arg2)
{
//It is guaranteed that we will call foo(Base)
//Only issue is which class's version of foo(Base)
//is called; the dynamic type of arg1 is used
//to decide
arg1.foo(arg2);
}
public static void main(String []args)
{
Base b = new Base();
Derived d = new Derived();

whichFoo(b,b);
whichFoo(b,d);
whichFoo(d,b);
whichFoo(d,d);
}
}打印结果为:
Base.Base
Base.Base
Derived.Base
Derived.Base想请问大虾,结果为什么不是:
Base.Base
Base.Derived
Derived.Base
Derived.Derived.

解决方案 »

  1.   

    这个代码中继承的体现就是父类中的方法子类也有,但是会被子类Derived 覆盖
    whichFoo的一个参数是什么类型,就调用对应类型的foo方法,例如,arg1是Base类型就调用Base类的foo方法,第二个参数是什么类型,就调用该类中对应的foo方法
      

  2.   

    第二个参数是什么类型,就调用该类中对应的foo方法那为什么语句whichFoo(d,d);打印结果不是:Derived.Derived.实际却是Derived.Base呢
      

  3.   

    其实这段代码的突破口可以从public class StaticParamsDemo
    {
    public static void whichFoo(Base arg1, Base arg2)
    {
    arg1.foo(arg2);
    }
    public static void main(String []args)
    {
    Base b = new Base();
    Derived d = new Derived();whichFoo(b,b); //第一个参数是b那就是进类Base 然后调用whichFoo,那第一个参数是类Base 自然就打印出Base 类中的第一个System.out.println("Base.Base");
    whichFoo(b,d);//第一个参数是b那就是进类Base 然后调用whichFoo,那第一个参数是类Base 自然就打印出Base 类中的第一个System.out.println("Base.Base");
    whichFoo(d,b);//第一个参数是d那就是进类Derived然后调用whichFoo,那第一个参数是类Derived 自然就打印出Derived类中的第一个System.out.println("Derived.Base");
    whichFoo(d,d);//第一个参数是d那就是进类Derived然后调用whichFoo,那第一个参数是类Derived 自然就打印出Derived类中的第一个System.out.println("Derived.Base");
    }
    }
      

  4.   

    谢谢但还是不明白。。
    怎么调用whichFoo才会打印Derived.Derived或者Base.Derived?
      

  5.   


    public class StaticParamsDemo
    {
    public static void whichFoo(Base arg1, Base arg2)
    {
    arg1.foo(arg2);
    }
    public static void whichtwo(Base arg1,Derived arg2){
    arg1.foo(arg2);
    }
    public static void main(String []args)
    {
    Base b = new Base();
    Derived d = new Derived();
    whichFoo(b,b);
    whichtwo(b,d);
    whichFoo(d,b);
    whichtwo(d,d);
    }
    }
    加一个方法
      

  6.   

    结果是:
    Base.Base
    Base.Derived
    Derived.Base
    Derived.Derived
      

  7.   


    先确保实现没有问题,再考虑面向XX,面向XXX之类的。