类型转换问题引入
Java语言提供了进行普通类型转换的方法。例如:
double x = 3.14;
int y = (int)x;
那么某个类的对象引用转换成另一个类的对象引用会产生什么情况。例如:
//Manager为Employee的子类
//会发生向下转型产生错误--超类到子类
Employee employee = new Employee();
Manager manager = (Manger)employee;
//向上类型转换--子类到超类
Manager manager = new Manager();
Employee employee = (Employee)manager;
通过测试发现向上转型可以正常通过,向下转型在编译过程中报错。
类型转换分析
Java中进行转型的唯一原因是:在暂时忽视对象的实际类型后,使用对象的全部功能。
那么将一个子类的引用赋给一个超类变量是允许的,反之必须进行类型转换才能通过运行时的检查。
这样听起来可能有些迷糊,我个人理解是,子类继承自超类,功能得到了扩展,这时候如果有个超类对象变量employee ,我们在经过向上转型后(自动实现)他就可以拥有子类的功能。而反过来想,如果我们有了子类变量,但要向下转型成超类,那么这个变量即manager 的子类功能得到限制,这样系统当然不会运行编译通过了。
向上转换一般是安全的,所以支持自动转换,即可以去掉括号,而向下转换很容易出现问题所以一般不推荐使用,若一定要使用时可以通过例子那样强制转换,但在进行转换之前还应该查看是否能够成功的转换。例如:
Manager manager ;
if(employee instanceof Employee){
//向下转型前一定要先向上转型后才可以实现
Manager m = new Manager("经理",5000);
Employee e = m;//向上转型,可以自动完成
manager = (Manager)e;//向下转型
manager.getInfo();
}
我们知道Java继承过程中会发生重载的问题那么向上类型转换后,究竟调用的是那个类的方法?
子类。这也如同上面解释的那样,超类对象在转型后会扩展功能,这时候调用的即为子类的方法。
//以下为测试源代码
class Employee{//员工类
private String name;
Employee(){
}
Employee(String name){
this.name = name;
}
public void getInfo(){
System.out.println("当前用户:"+this.name);
}
public String getName(){
return name;
}
}
class Manager extends Employee{//经理类
private int bonus;
Manager(String name,int bonus){
super(name);
this.bonus = bonus;
}
public void getInfo(){
System.out.println("当前用户是:"+super.getName()+" 奖金是:"+this.bonus);
}
}
public class JavaTest4_4 {
public static void main(String args[]){
test1();
test2();
}
public static void test1(){
//向下转型产生错误
Employee employee = new Employee("员工");
employee.getInfo();
Manager manager ;
if(employee instanceof Employee){
//向下转型前一定要先向上转型后才可以实现
Manager m = new Manager("经理",5000);
Employee e = m;//向上转型,可以自动完成
manager = (Manager)e;//向下转型
manager.getInfo();
}
}
public static void test2(){
//向上转型正常
Manager manager = new Manager("经理",5000);
manager.getInfo();
Employee employee = (Employee)manager;
employee.getInfo();
}
}