比如有一个类Employee,类Manager从Employee继承Emplyee e=new Manager();用引用e能使用Manager类中新写的方法,却为何不能访问其新写的变量呢?或者说定义一个函数 void func(Employee e);
把Manager类型的对象传给它,那么通过e能够访问两个类中的什么东西?希望能得到详细的解释。

解决方案 »

  1.   

    这个是一个继承的问题,如果你继续学习的话,会在多态中经常碰到此类问题。
    如你说的那样,Emplyee e=new Manager(); 实际上类Manager是Emplyee的子类,这样写的目的是,父类的对象和继承它的子类对象都能够作为参数传到方法里面去。
    如果定义一个函数 void func(Employee e); 
    把Manager类型的对象传给它,那么通过e可以访问的是父类中所有存在的并且访问范围不是private的变量和方法。如果子类里面有的方法,但是父类中却没有这个方法的话,那么e是不能访问的。如果想让e访问子类有的方法并且父类没有的方法,那只能是这样写:Manager e=new Manager(); 
      

  2.   

    更正一下:那么通过e可以访问的是父类中所有存在的并且访问范围不是private和默认访问范围的变量和方法。
      

  3.   

    变量是不是private的啊,那子类就不能访问了
      

  4.   

    更正一下:那么通过e可以访问的是父类中所有存在的并且访问范围不是private和默认访问范围的变量和方法。
      

  5.   

    Manager类中新写的方法对于Employee类的对象来说是不可见的,所以不能访问。
      

  6.   

    因为e是Emplyee类型,所以只能使用Emplyee中定义的拥有访问权限的成员
      

  7.   

    Emplyee e=new Manager(); 实际上类Manager是Emplyee的子类,这里是父类的引用指向子类的对象,这样写的目的是,父类的对象和继承它的子类对象都能够作为参数传到方法里面去。
    如果定义一个函数 void func(Employee e);
    把Manager类型的对象传给它,那么通过e可以访问的是父类中所有存在的并且访问范围不是private的并且不是默认类型的变量和方法。如果子类里面有的方法,但是父类中却没有这个方法的话,那么e是不能访问的。如果想让e访问子类有的方法并且父类没有的方法,那只能是这样写:Manager e=new Manager();
      

  8.   


    我是这样理解的:父类    Employee子类    Manager首先 e = new Manager()
        也就是说e是个Manager对象
    然后 Emplyee e
        e 的类型从 子类 Manager转型至 父类 Employee
        也就是向上转型
    这里的"新写"很让人费解
      

  9.   

    这是一个多态中典型的问题
    Employee e = new Manager();
    可以看作两步来分析:
    Employee e = new Employee();
    e = (Manager) e;
    Employee类型的对象e是编译时的类型,
    而Manager类型的对象e是运行时的类型。
    可以称为:对象上溯
    此时的e对象可以访问到Employee类中的属性和未被其子类重写的方法
    如果e对象要访问Manager类中的属性和Manager自身的新方法(非父类中存在的方法),则必须重新 new Mangager();