第2节 塑型
7.2 塑型
塑型(type-casting)
又称为类型转换
方式
隐式(自动)的类型转换
显式(强制)的类型转换
7.2.1 塑型的概念
塑型的对象
引用变量
将对象暂时当成更一般的对象来对待,并不改变其类型
只能被塑型为
任何一个父类类型
对象所属的类实现的一个接口
被塑型为父类或接口后,再被塑型回其本身所在的类
7.2.1 塑型的概念——一个例子
Manager对象
可以被塑型为Employee、Person、Object或Insurable,
不能被塑型为Customer、Company或Car

7.2.1 塑型的概念——隐式(自动)的类型转换
引用变量
被塑型成更一般的类
Employee emp;
emp = new Manager();
Car jetta = new Car();
Insurable item = jetta;
7.2.1 塑型的概念——显式(强制)的类型转换
引用变量:还原为本来的类型
Employee emp;
Manager man;
emp = new Manager();
man = (Manager)emp; //将emp强制塑型为本来的类型
7.2.2 塑型的应用
当一个类对象被塑型为其父类后,它提供的方法会减少
当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法
将其塑型为本来的类型后,又能接收getSalary()方法了

7.2.3 方法的查找
如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法?
实例方法
类方法
7.2.3 方法的查找——实例方法

Manager?? man = new Manager();
Employee? emp1 = new Employee();
Employee? emp2 = (Employee)man;
emp1.computePay(); // 调用Employee类中的computePay()方法
man.computePay();? // 调用Manager类中的computePay()方法
emp2.computePay(); // 调用Manager类中的computePay()方法
7.2.3 方法的查找——类方法
总是在变量声明时所属的类中进行查找 9
Manager man = new Manager();
Employee emp1 = new Employee();
Employee emp2 = (Employee)man;
man.expenseAllowance(); //in Manager
emp1.expenseAllowance(); //in Employee
emp2.expenseAllowance(); //in Employee!!!
塑型(type-casting)
又称为类型转换
方式
隐式(自动)的类型转换
显式(强制)的类型转换
7.2.1 塑型的概念
塑型的对象
引用变量
将对象暂时当成更一般的对象来对待,并不改变其类型
只能被塑型为
任何一个父类类型
对象所属的类实现的一个接口
被塑型为父类或接口后,再被塑型回其本身所在的类
7.2.1 塑型的概念——一个例子
Manager对象
可以被塑型为Employee、Person、Object或Insurable,
不能被塑型为Customer、Company或Car

7.2.1 塑型的概念——隐式(自动)的类型转换
引用变量
被塑型成更一般的类
Employee emp;
emp = new Manager();
Car jetta = new Car();
Insurable item = jetta;
7.2.1 塑型的概念——显式(强制)的类型转换
引用变量:还原为本来的类型
Employee emp;
Manager man;
emp = new Manager();
man = (Manager)emp; //将emp强制塑型为本来的类型
7.2.2 塑型的应用
当一个类对象被塑型为其父类后,它提供的方法会减少
当Manager对象被塑型为Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法
将其塑型为本来的类型后,又能接收getSalary()方法了

7.2.3 方法的查找
如果在塑型前和塑型后的类中都提供了相同的方法,如果将此方法发送给塑型后的对象,那么系统将会调用哪一个类中的方法?
实例方法
类方法
7.2.3 方法的查找——实例方法

Manager?? man = new Manager();
Employee? emp1 = new Employee();
Employee? emp2 = (Employee)man;
emp1.computePay(); // 调用Employee类中的computePay()方法
man.computePay();? // 调用Manager类中的computePay()方法
emp2.computePay(); // 调用Manager类中的computePay()方法
7.2.3 方法的查找——类方法
总是在变量声明时所属的类中进行查找 9
Manager man = new Manager();
Employee emp1 = new Employee();
Employee emp2 = (Employee)man;
man.expenseAllowance(); //in Manager
emp1.expenseAllowance(); //in Employee
emp2.expenseAllowance(); //in Employee!!!


