赋值兼容规定:在继承树中允许向上赋值,不允许向下赋值:

假如有层次关系如下:

 

每个类里的具体内容(不是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();