类型转换问题引入

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();
    }
}