引用类型的转换

Posted libinhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用类型的转换相关的知识,希望对你有一定的参考价值。

多态的转型分为向上转型与向下转型两种:

 

向上转型:

其实就是把子类类型的对象 赋值给 父类类型的引用,这个过程是自动转换的,类似基本数据类型的自动类型转换

 

格式:

父类类型  变量名 = new 子类类型();
如:Animal a = new Cat();

 

 

向下转型:

父类类型向子类类型向下转换的过程,这个过程是强制的,类似基本数据类型的强制类型转换

 

格式:

子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;  

 

向下转型一旦没有注意,就会出现类型转换异常:ClassCastException,所以应该在转型之前先判断一下是否能转型

代码举例

定义类:

abstract class Animal   
    abstract void eat();  
  

class Cat extends Animal   
    public void eat()   
        System.out.println("吃鱼");  
      
    public void catchMouse()   
        System.out.println("抓老鼠");  
      
  

class Dog extends Animal   
    public void eat()   
        System.out.println("吃骨头");  
      
    public void watchHouse()   
        System.out.println("看家");  
      

转型的过程中,一不小心就会遇到这样的问题,请看如下代码:

public class Test 
    public static void main(String[] args) 
        // 向上转型  
        Animal a = new Cat();  
        a.eat();               // 调用的是 Cat 的 eat

        // 向下转型  
        Dog d = (Dog)a;       
        d.watchHouse();        // 调用的是 Dog 的 watchHouse 【运行报错】
      

这段代码可以通过编译,但是运行时,却报出了 ClassCastException ,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。

instanceof关键字

为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:

变量名 instanceof 数据类型 
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。

所以,转换前,我们最好先做一个判断,代码如下:

public class Test 
    public static void main(String[] args) 
        // 向上转型  
        Animal a = new Cat();  
        a.eat();               // 调用的是 Cat 的 eat

        // 向下转型  
        if (a instanceof Cat)
            Cat c = (Cat)a;       
            c.catchMouse();        // 调用的是 Cat 的 catchMouse
         else if (a instanceof Dog)
            Dog d = (Dog)a;       
            d.watchHouse();       // 调用的是 Dog 的 watchHouse
        
      

 

以上是关于引用类型的转换的主要内容,如果未能解决你的问题,请参考以下文章

今天聊一聊Java引用类型的强制类型转换

unity C# 法通过引用转换...将类型“UnityEngine.GameObject”转换为“UnityEngine.Rigidbody”

通过不同类型的引用传递参数时如何进行类型转换

poi excel自己主动转换成javabean 支持引用类型属性二级转换

在本地引用 TypeScript dom lib 类型

java引用类型的类型转换规则是啥?