test被转化为一个SuperClass对象,它只能访问超类中定义的部分。

解决方案 »

  1.   

    是吗?
    示例2:
    class Super
    {
    public void print()
    {
    System.out.println("super");
    }
    }
    public class Sub extends Super
    {
    public void print()
    {
    System.out.println("sub");
    }
    public static void main(String[] args)
    {
    Super test = new Sub();
    test.print();
    }
    }
    运行结果:sub
    那这个怎么解释?
      

  2.   

    其实,这是一种继承的策略。子类在继承父类时,只有Method是可以被动态绑定的;
    而Class Member是不能被动态绑定的。忘了是哪一本书里有对这个问题的具体分析去了,自己找找吧。^_^
      

  3.   

    Super test = new Sub();
    这种情况实际上是多态的表现。多态是指一个对象具有形式和实际两种形式,在调用的时候调用的是实际类型。(编译时却还是按形式)
    比如上一条语句,test对象的形式类型是Super的,而实际创建时却是Sub类型。
    那么在test.print();执行时,执行的是子类的方法。(所谓调用/使用的是实际类型)
    而变量不具有多态。
    我记得是在什么地方看到的。如有出入,或需详细举例讨论,下次找来再回复。
      

  4.   

    在上篇回复基础上:
    --------------------------------------------------------------
    修改后的示例2:
    class Super
    {
      public void print()
      {System.out.println("super-print");}
      void methodSuper()
      {System.out.println("super-methodSuper");}
     }
    class Sub extends Super
    {
      public void print()
      {System.out.println("sub");}
      void methodSub()
      {System.out.println("sub-methodSub");}
    }
    public class Test
    { public static void main(String[] args)
      { Super test = new Sub();
        test.print();//运行结果:sub
        test.methodSuper();//运行结果:super-methodSuper
        test.methodSub ();//编译错误
      }
    }
    //注:在1.3.1通过
    -----------------------------------------------------------------
    1 编译时看形式类型,因此语句test.methodSub ();//编译错误
    2 执行时看实际类型,因此test.print();//运行结果:sub
    3 子类没有methodSuper,但却从父类那里继承来了。因此test.methodSuper();//运行结果:super-methodSuper
    4 注意,多态只对实例方法而言,并不用在类方法(静态方法)和域。
    ------------------------------------------------------------------
    我是来学习的,很高兴能帮到你。愿我们互相帮助!