在JAVA中,一个对象只能有一种类型,比如:Employee e = new Employee(),e是Employee类(也相当于一种自定义的类型)的一个对象。但是,一个变量却可以指向不同类型的对象,那么可以说变量时具有多态性的。对于一个类的继承:
public class Employee{
String name;
int salary;
public String getDetails(){
}
}
public class Manager extends Employee{
String department;
public String getDetails(){
}
}
如下对对象的声明我们可以理解:
Employee e = new Employee();
Manager m = new Manager();
e是Employee的一个对象,m是Manager的一个对象。但是,如果是这样定义又该如何理解呢:Employee m = new Manager()。
此时m作为Employee的一个对象,而不是Manager的对象,因此这样的引用时不允许的:
m.department = "Finance";//非法,编译时就会报错
可能有些人不太理解,为什么明明是new了一个Manager,为什么m却不能访问Manager的属性变量。原因是在编译阶段,变量m是Employee的类型,编译器并不管运行时m指向的具体对象是Employee的对象还是Manager的对象,它只能访问Employee里面定义的变量和方法。也就是说,编译时看数据类型。
那么如果要访问Manager里面的属性变量department,可以进行强制类型转换,把它还原成Manager类型,方法如下:
Employee m = new Manager();
Manager n = (Manager)m;
n.department = "Finance";//这就是合法的了