RT.. 其中Employee为父类, Manager为Employee的子类.public class ManagerTest
{
   public static void main(String[] args)
   {
       Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
       boss.setBonus(5000);
    
       Employee[] staff = new Employee[1];
       staff[0] = boss;
       staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);         .........

   }}请问,这里boss为子类Manager的实例对像,但为什么它可以这样定义:
Employee[] staff = new Employee[1];
staff[0] = boss;
staff为父类实例对像,boss为子类实例对像. staff[0] = boss 是什么意思呢..? 父类怎么能掉用子类呢..?

解决方案 »

  1.   

    这是一个“多态”的实现。父类的引用可以指向它的子类实例,但是子类引用不能指向父类的实例。程序编译时,并没有知道staff[0]所指向的实例。只有运行时,才知道,这是多态的作用。你可以参考一下其他书籍对多态的介绍,你学java应该要知道这个。介绍你看  java核心技术 基础  这本书,去了解一下。
      

  2.   

    谢谢楼上的.我就是看的java核心技术 卷1 基础知识.
    我也正是看到了多态.. 但我有不解.所以发上来请教大家..
    麻烦大家解释清楚,让小弟学习下.. 谢谢.
      

  3.   

    我现在似乎有点明白了..但我把代码改成如下,有些还是不明白.public class ManagerTest
    {
    public static void main(String[] args)
    {

    Employee[] staff = new Employee[3];

    //fill the staff array with Manager and Employee objects;
    staff[0] = new Manager("Carl Cracker", 80000, 1987, 12, 15);//这样可以.
    staff[0].setBonus(7000);//但这里不行..请问这是什么?
    staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
    staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

    //print out informaton about all Employee objects
    for(int i = 0; i < staff.length; i++)
    {
    Employee e = staff[i];
    System.out.println("name = " + e.getName() + ",salary = " + e.getSalary());
    }
    }
    }
      

  4.   

    上面代码似乎不太好看..我现在重发一下:
    setBonus 是子类Manager里的一个方法.public class ManagerTest
    {
       public static void main(String[] args)
       {
          Employee[] staff = new Employee[3];
          staff[0] = new Manager("Carl Cracker", 80000, 1987, 12, 15);//这样可以.请问为什么行
          staff[0].setBonus(7000); // 这里不可以这样调用..请问为什么不行?
          staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
          staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);      for(int i = 0; i < staff.length; i++)
          {
            Employee e = staff[i];
            System.out.println("name = " + e.getName() + ",salary = " + e.getSalary());
    }
          }
    }
      

  5.   

    staff[0] = new Manager("Carl Cracker", 80000, 1987, 12, 15);//这样可以.请问为什么行
    上溯,ok
    staff[0].setBonus(7000); // 这里不可以这样调用..请问为什么不行?
    此时编译器只知道staff[0]是一Employee,而Employee中并没有setBonus(7000)方法,所以当然要报错了。
      

  6.   

    staff[0]是Employee父类, 但它却new Manager. 它这样实例化是什么意义啊..?
      

  7.   

    对Employee[] staff = new Employee[1];来说Employee[i]是指向一个Employee对象的引用对象(你可以理解为指针,当然是不一样的),就像一个遥控器,他所有的功能就局限于Employee的功能。Manager作为Employee的子类,拥有父类Employee的所有功能。也就是说这个遥控器发出的指令,Manager都能执行。可以有很多名词说明这个东西:上溯造型,面向接口编程,李氏替换(有点类似)
    以后接触多了自然就习惯了