`

引用变量的强制类型转换

    博客分类:
  • java
阅读更多

当我们编写JAVA程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用对象确实包含该方法。

如果需要让这个引用变量来调用它运行时类型的方法,则是必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符。

 

强制类型转换时需要注意:

基本类型之间的转换只能在数值型之间进行,这里所说的数值类型包括整数型、字符型和浮点型。但数值型不能和布尔型之音进行类型转换。

引用类型之间的转换只能在继承关系之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时就会出现错误。

如果试图把一个父类实例转换子类类型,则必须这个对象实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类型),否则将在运行时引发ClassCastException异常。

 

package com.ez.impl;
/**
 * @author 窗外赏雪(EZ编程网)
 */
public class ConversionTest {
    public static void main(String[] args) {
        double price = 32.4;
        long lprice = (long) price; // 基本数据类型的强制类型转换

        int age = 5;
//      boolean b = (boolean)age;编译时出错:试图把一个数值型变量转换为boolean型

//      obj变量的编译时类型为Object,是String类型的父类,所以可以强制类型转换为Object
        Object obj = "窗外赏雪";

//      obj变量的运行时类型是String类型,所以可以强制类型转换为String
        String strObj = (String) obj;
//      obj变量的运行时类型是String类型,所以不可以强制类型转换为Integer
        Integer intObj=(Integer)obj;
    }
}

 

进行强制类型转换时可能出现异常,因此进行类型转换之前应先通过instanceof运行符来判断是否可以成功转换。

例如上面的String intObj = (Integer) obj; 代码运行时会引发ClassCastException异常,这是因为obj不可转换成Integer类型,

为了程序更加健壮,可以将代码改写如下:

if(obj instanceof Integer)

{

        Integer intObj = (Integer) obj;

}

 

在进行强制类型转换之前,先用instanceof运行符判断是否可以成功转换,从而避免出现ClassCastException异常,这样可以保证程序更加健壮。

 

当把子类对象赋给父类引用变量时,被称为向上转型(upcasting)向上转型没必要手动强制类型转换,系统会自动完成这种转型。

这种转型只是表明这个引用变量的编译类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。并且总是可以成功的。

 

但把一个父类对象赋给子类引用变量时,就需要进行强制类型转换,而且还可能在运行时产生ClassCastException异常,使用instanceof运行符可以让强制类型转换更安全。

 

instanceof运行符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的对象是否是后面的类,或者其子类的实例。如果是,则返回true,否则返回false.

 

注意:instanceof运行符前面操作数的编译时类型要么与后面的类相同,要么是后面类的父类,否则会引用编译错误。

Object obj= "窗外赏雪"; 代码定义了一个obj变量,这个变量编译时类型是Object类,但运行时类型是String。因为Object 是所有类、接口的父类,因此可以执行hello instanceof String和hello instanceof Integer等。

 

String str = "窗外赏雪";代码定义的变量str,就不能执行str instanceof Integer 因为str的编译时类型是String。String 类型既不是Integer类型,也不是Integer类型的父类,所以当执行到这段代码的时候会报错。

 

instanceof 运行符的作用是在执行强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功地转换,从而保证代码更加分健壮。

instanceof和(type)是JAVA提供的两个相关的运算符,通常先用instanceof判断一个对象是否可以强制类型转换,然后再使用(type)运算符进行强制类型转换,从而保证程序不会出现错误。

 

 

分享到:
评论

相关推荐

    C++4种强制类型转换

    在C++编程语言中,强制类型转换是一种将变量或表达式从一种数据类型转换到另一种数据类型的方法。C++提供了四种标准的强制类型转换运算符,分别是`static_cast`、`dynamic_cast`、`reinterpret_cast`和`const_cast`...

    实例022 - 自动类型转换与强制类型转换

    在编程领域,自动类型转换和强制类型转换是两种常见的数据类型转换方式,它们在处理不同数据类型间的操作时起着至关重要的作用。本实例022将深入探讨这两种转换机制,帮助开发者更好地理解和运用。 自动类型转换...

    JAVA程序设计课件-变量的类型转换.pptx

    例如,一个byte类型的变量与另一个byte类型的变量相加时,它们在计算过程中都会被提升为int类型,即使结果仍然在byte的范围内,也必须通过强制类型转换才能将其赋值回byte类型。 了解这些基本概念对于编写有效的...

    C++ 中的强制类型转换

    在C++编程语言中,强制类型转换是一种将变量或表达式从一种数据类型转换为另一种数据类型的方法。这种转换在处理不同类型之间的兼容性问题时非常有用。C++提供了四种显示的强制类型转换操作符,分别是`const_cast`、...

    【IT十八掌徐培成】Java基础第02天-03.数据类型-强制类型转换.zip

    数据类型-强制类型转换”主要探讨了Java中的数据类型转换,特别是强制类型转换。 1. 基本数据类型: - 整型:byte(1字节),short(2字节),int(4字节),long(8字节) - 浮点型:float(4字节),double(8...

    C++强制类型转换

    #### 二、C风格的强制类型转换 在C语言中,类型转换通常采用这样的形式:`TYPEb = (TYPE)a`。这种转换方式简单直接,但在C++中可能会带来潜在的问题,尤其是在复杂的对象和指针处理上。因此,C++引入了更为精细的...

    1. 强制类型转换1

    首先,C风格的强制类型转换是通过`(目标类型)变量名`或`目标类型(变量名)`的形式实现的。例如 `(int)3.14` 会将浮点数3.14转换为整数。这种转换方式在编译时执行,但不提供安全性检查,因此可能导致数据丢失或错误。...

    c++四种强制类型转换

    ### C++中的四种强制类型转换 C++提供了一组丰富的类型转换工具,使得开发者能够根据需求灵活地在不同类型间进行转换。本文将详细介绍这四种类型转换:`const_cast`、`static_cast`、`dynamic_cast` 和 `...

    浅谈Java中强制类型转换的问题

    而显式类型转换,也就是强制类型转换,需要程序员通过显式的转换操作符 `(type)` 来完成,通常是从较大的数据类型转换到较小的,或者从父类引用转换到子类实例。 在给出的例子中,我们看到了一个关于强制类型转换的...

    每天学点C++(C++实例教程:教程+源码)强制类型转换.zip

    在学习C++的过程中,强制类型转换是一个重要的概念,它允许程序员在不同数据类型之间进行转换。本教程将深入探讨C++中的强制类型转换,并通过实例代码帮助你更好地理解和应用这些知识。 首先,我们要理解C++中的四...

    C++的cast强制类型转换

    ### C++的cast强制类型转换:深入解析与应用 在C++编程中,类型转换是一项基本而又关键的技术,尤其在处理复杂数据结构和类层次结构时。C++提供了多种类型转换方式,包括`static_cast`、`dynamic_cast`、`const_...

    C++宏,预处理器,RTTI,typeid与强制类型转换专题.pdf

    ### C++宏、预处理器、RTTI、typeid与强制类型转换专题 #### 一、概述 本文档由黄邦勇帅编写,旨在深入探讨C++中的几个重要概念:`sizeof`操作符、预处理器(包括`#define`)、运行时类型识别(RTTI)与`typeid`以及...

    Java3、类型转换(变量转换和方法转换).doc

    1. **父类到子类**:从父类引用到子类对象的转换需要显式地使用强制类型转换。 示例: ```java Parent p = new Child(); Child c = (Child) p; // 强制类型转换 ``` 2. **子类到父类**:从子类对象到父类...

    编程语言java类型转换.pdf

    - 引用类型间的转换需要遵循继承关系,即子类对象可以引用父类类型的变量,但父类类型的变量不能引用子类对象,除非进行强制类型转换。 - 强制类型转换后,可以调用子类中特有的方法,但前提是该对象实际是子类的...

    解析C++中四种强制类型转换的区别详解

    C++中的四种强制类型转换是static_cast、dynamic_cast、const_cast和reinterpret_cast,它们提供了对类型转换的不同控制和用途,确保了代码的清晰性和安全性。下面分别详细解释这四种转换。 1. static_cast:主要...

    深入分析java中的类型转换

    在Java中,类型转换主要分为两大类:**隐式自动类型转换**和**强制手动类型转换**。 #### 隐式自动类型转换 隐式自动类型转换指的是Java编译器自动完成的类型转换过程。这种类型的转换通常发生在较小的数据类型向较...

    C#自动类型转换与强制类型转换的讲解

    强制类型转换通常通过括号来实现,将目标类型放在要转换的变量前。需要注意的是,如果转换可能导致数据丢失或不兼容类型,编译器会报错。 C#还提供了几种内置的方法来进行类型转换,例如`Convert.ToInt32()`和`Int...

    java 数据类型转换

    本文将深入探讨Java中的数据类型转换,包括自动类型转换(隐式转换)和强制类型转换(显式转换)。 ### 自动类型转换(隐式转换) 当一个数据类型转换为另一个兼容的、范围更大的数据类型时,Java会自动执行这种...

    JAVA类型转换.pdf

    强制类型转换的语法是在变量前加上目标类型。例如,将一个double类型的值赋值给一个int类型的变量,需要写成:(int) doubleValue。 - 在进行强制类型转换时,可能会有数据精度的损失。比如,将double类型转换为int...

    在C++要求对所有用到的变量作强制定义,

    强制类型转换运算符在C++中扮演着重要的角色,它允许程序员在不同数据类型之间进行显式的类型转换。这种转换在处理多种数据类型的混合运算时尤其有用,因为C++默认的自动类型转换可能不总是满足程序员的预期。例如,...

Global site tag (gtag.js) - Google Analytics