【Java】类继承中的赋值兼容规则及对象转换
赋值兼容规定:在继承树中允许向上赋值,不允许向下赋值:
假如有层次关系如下:
每个类里的具体内容(不是Java代码)
一般正常定义对象:
Manager m = new Maneger();
兼容规则可以让我们这么做:
Employee e = new Manager();
为什么可以这样呢?
当你定义的Employee e是用一个Manager()去实例化(ps:就是给e分配一个Manager()型的储存空间)的时候,你还是可以按照它是Employee类的方式去访问它的对象;
比如:
e.Organizing_ability;
Manager()类继承了Employee()类的Organizing_ablility,所以尽管用了Manager()类依然不影响这一点。
同样的,你也可以:
Object o = new Manager();
或者:
Object o = new Contractor();
但如果反过来(向下赋值):
Manager m = new Empolyee();
当你想按照m是一个Manager()类的实例去访问他的内部成员时:
m.Leadership;
程序将会报错:
因为之前向下赋值,给m分配了一块Employee()型的储存空间,而这里面根本没有Leadership这个属性。
对象转换:
上面我们定义过:Employee e = new Manager();
虽然可以这么定义,但实际上还是要转换为正确的类型才能方便实际应用。
即:
Manage m=(Manager)e;
转换的时候,注意判断对象是不是别的子类的实例,这里会用到“instanceof”。
public void MesEx(Employee e) {
if(e instanceof Manager){
Manager m = (Manager)e;
System.out.println("Actually, e is a Manager");
}
else if(e instanceof Contractor){
Contractor c = (Contractor)e;
System.out.println("Actually, e is a Contractor");
}
else
System.out.println("e is really a Employee");
}
实参中的对象转换:
public Salary CacuSy(Employee e) {
//针对e内各个成员进行操作
}
写程序的时候,我们可以这样定义:
Manager m = new Manager();
Salary S = CacuSy(m);
因为m是Manager()类(Employee类的子类),所以调用CacuSy()方法时,方法对e进行各种“Employee类成员”的操作时,在m里也能找到相应的成员。
*异类集合:
根据上面定义的几个类:
我们可以定义一个异类集合去存放那些相关的父类对象,子类对象。
Employee [] staff = new Employee[1024];
staff[0] = new Manger();
staff[1] = new Employee();
staff[2] = new Contractor();