小弟新写的一个类
class Base
{
        protected String name()
        {
                return"base";
        }
}public class Son extends Base
{
        protected String name()
        {
                return "son";
        }         protected void printName()
         {
                Base ref =(Base)this;
                System.out.println("this.name is "+this.name());//son
                System.out.println("ref.name is "+ref.name());     //base
                System.out.println("Super.name is "+super.name());//base
        }
        public static void main(String[] args)
        {
                Son s = new Son();
                s.printName();
        }}我以为输出结果是son,base,base,但是运行的输出结果却是son,son,base请大家帮我解答一下第二项为什么不是base,
我认为Base ref =(Base)this;已经获得ref为Base类的引用,但为什么没有调用Base类的name方法,请教

解决方案 »

  1.   

    ref.name()); 
    这个方法的调用是运行时绑定的,即根据ref实际的类型(Son)来调用name()方法
      

  2.   

    这就是java语言的多太性,也是人们喜欢它的原因之一 ,呵呵
      

  3.   

    Base ref =(Base)this 在这里把s引用对象赋给了ref ,ref是Base的对象,所以ref调用的 name()是父类的!
    System.out.println("ref.name is "+ref.name());输出就是base!
      

  4.   

    简单说吧:Base ref =(Base)this;这句话并未改变ref的类型,但是这里的ref依然是一个SON类,你这里只是可以把它当成一个BASE类,并不能改变它的类型。BASE类是基类,SON类是继承类,那么SON类可以被当成是BASE类,但是这并不能说SON类就是BASE类。比如 马是基类,千里马是继承类。比如马可以日跑百里,千里马可以日跑千里。A马是千里马,千里马是马,A马也是马,但是A马依然可以日跑千里而不是百里。这个就是多态性。不知道你明白了吗?
      

  5.   

    Base ref =(Base)this
    简单点说就是
    虽然ref 是Base类的引用,但this在内存中仍然是Son的对象
    根据多态性,父类的引用可以指向其子类的对象,注意,是指向!