多态与类型的一点理解

在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";//这就是合法的了

原文地址:https://www.cnblogs.com/micky1989/p/3021123.html