比如有一个类Employee,类Manager从Employee继承Emplyee e=new Manager();用引用e能使用Manager类中新写的方法,却为何不能访问其新写的变量呢?或者说定义一个函数 void func(Employee e);
把Manager类型的对象传给它,那么通过e能够访问两个类中的什么东西?希望能得到详细的解释。
把Manager类型的对象传给它,那么通过e能够访问两个类中的什么东西?希望能得到详细的解释。
如你说的那样,Emplyee e=new Manager(); 实际上类Manager是Emplyee的子类,这样写的目的是,父类的对象和继承它的子类对象都能够作为参数传到方法里面去。
如果定义一个函数 void func(Employee e);
把Manager类型的对象传给它,那么通过e可以访问的是父类中所有存在的并且访问范围不是private的变量和方法。如果子类里面有的方法,但是父类中却没有这个方法的话,那么e是不能访问的。如果想让e访问子类有的方法并且父类没有的方法,那只能是这样写:Manager e=new Manager();
如果定义一个函数 void func(Employee e);
把Manager类型的对象传给它,那么通过e可以访问的是父类中所有存在的并且访问范围不是private的并且不是默认类型的变量和方法。如果子类里面有的方法,但是父类中却没有这个方法的话,那么e是不能访问的。如果想让e访问子类有的方法并且父类没有的方法,那只能是这样写:Manager e=new Manager();
我是这样理解的:父类 Employee子类 Manager首先 e = new Manager()
也就是说e是个Manager对象
然后 Emplyee e
e 的类型从 子类 Manager转型至 父类 Employee
也就是向上转型
这里的"新写"很让人费解
Employee e = new Manager();
可以看作两步来分析:
Employee e = new Employee();
e = (Manager) e;
Employee类型的对象e是编译时的类型,
而Manager类型的对象e是运行时的类型。
可以称为:对象上溯
此时的e对象可以访问到Employee类中的属性和未被其子类重写的方法
如果e对象要访问Manager类中的属性和Manager自身的新方法(非父类中存在的方法),则必须重新 new Mangager();