大家能举个例子吗?书上有句话是这样说的:
"理解是引用变量的类型--而不是引用对象的类型--决定了什么成员可以被访问.也就是说,当一个子类对象的引用被赋给一个超类引用变量时,你只能访问超类定义的对象的那一部分.这是为什么plainbox不能访问weight的原因,甚至是它引用了一个BoxWeight对象也不行."超类Box
子类BoxWeightBoxWeight weightbox = new BoxWeight();
Box plainbox = new Box();plainbox = weightbox;weight是子类BoxWeight的一个变量...

解决方案 »

  1.   

    plainbox是超类Box的引用变量吗?
      

  2.   

    那书上怎么这么讲呢?"当一个子类对象的引用被赋给一个超类引用变量时,你只能访问超类定义的对象的那一部分."plainbox = weightbox;
      

  3.   

    当plainbox = weightbox;以后有以下特点:
    1、plainbox的类型是Box(即上述的各“引用变量类型”,这是变量声明时定义的);
    2、plainbox变量所指向的具体对象是BoxWeight类型的;(即上述的“引用对象类型”);
    此时假设Box定义的成员有A、B;BoxWeight则包括继承而来的A、B以及自己定义的C。因为plainbox变量所指向的具体对象是BoxWeight类型的,所以实际上他有A、B、C三个成员。但是其中只有A、B可访问(因为plainbox的类型是Box,而对于Box类型来说公开可知的成员只有A、B,子类定义的C是不可知的),这就是所谓的“引用变量的类型(而不是引用对象的类型)决定了什么成员可以被访问”。
      

  4.   

    那为什么以下程序会输出这样的结果呢?class A{
      void Callme()
      {
        System.out.println("Inside A's Callme method");
      }
    }
    class B extends A{
      void Callme()
      {
        System.out.println("Inside B's Callme method");
      }
    }
    class C extends A{
      void Callme()
      {
        System.out.println("Inside C's Callme method");
      }
    }class Dispatch
    {
      public static void main(String[] args)
      {
      A a = new A();
      B b = new B();
      C c = new C();
      A r;  r = a;
      r.callme();
      
      r = b;
      r.callme();  r = c;
      r.callme();
      }
    }结果:
    Inside A's callme method
    Inside B's callme method
    Inside C's callme method
      

  5.   

    记住<thinking in java>的作者Bruce Eckel的一句经典的话吧,对象就是神奇的变量。
      

  6.   

    你能给我解释一下,我上面提的两种情况,为什么不一样吗?
    第1个:
    "当一个子类对象的引用被赋给一个超类引用变量时,你只能访问超类定义的对象的那一部分"第2个:
    r = b;后,r.callme();显示子类b的方法callme()
      

  7.   

    两种情况并不冲突啊:
    1、当r = b;后,根据A类型定义你对r能访问的依然是callme()成员。
    2、而此时的r所指向的对象虽然是B型的,其中callme()虽然重载了其超类方法,但编译器依然知道该对象里有一个名为callme的方法可以访问。假设该对象里还包括了其他的在子类中定义的成员方法,那么在此这些子类里定义的方法就不可用了。
    3、你的程序里之所以对每各对象调用相同方法而得出了不同结果,其实就是因为对编译器而言,它只知道每个对象里都有一个名为callme的方法可以访问,至于具体每个对象里的callme()执行什么动作是在运行时动态绑定的,这也是多态的一个体现。