`
supportopensource
  • 浏览: 522014 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

引用类型间的类型转换

阅读更多
引用类型间的转换有自动类型转换和强制类型转换两种。对于类引用类型,只有具有继承关系的类,即父类与子类之间,才可以进行类型的转换。
当引用了某个子类的变量对引用该子类的父类的变量赋值时,会自动进行类型的转换;反之,父类对子类进行赋值时则需要进行强制类型转换。
例如,A为父类,B、C分别继承自类A,分别定义引用这3个类的变量,然后进行各种赋值操作。
定义引用变量:
Object obj = new Object();
A objA = new A();
B objB = new B();
C objC = new C();

● 子类对父类进行赋值:
obj = objA;   //编译成功,将类A赋给直接父类Object,会自动进行类型转换
obj = objB;   //编译成功,将子类B赋给间接父类Object,会自动进行类型转换
objA = objC;  //编译成功,将子类C赋给直接父类A,会自动进行类型转换

● 父类对子类进行赋值:
objA = obj;      //编译出错,将父类Object赋给直接子类A时,需要强制类型转换
objA = (A)obj;   //编译成功
objB = obj;      //编译出错,将父类Object赋给间接子类B时,需要强制类型转换
objB = (B)obj ;   //编译成功
objC = objA;     //编译出错,将父类A赋给直接子类C时,需要强制类型转换
objC = (C)objA;  //编译成功

● 两个子类间的赋值:
如果两个不同的子类继承自同一个父类,那么这两个子类之间也不能进行类型转换,因为它们之间没有直接或间接的继承关系。
objB = objC;      //编译出错,不能从C类型自动转换为B类型
objB = (B)objC;   //编译出错,不能从C类型强制转换为B类型

● 如果声明了一个父类型的变量,但使其引用子类对象,在编译时,java编译器是根据变量被显示声明的类型去编译,因此该变量的类型被看作父类类型。然后将其进行强制类型转换并赋给引用了另一个子类对象的变量时编译成功,但运行时将抛出java.lang.ClassCastException异常,因为这个变量实际引用的是子类对象,两个子类属于不同的类型,也没有继承关系,所以不能将一个子类强制转换为另一个子类。
A objAA = new C();           //objAA变量被显示声明为A类型
objB = (B)objAA;            //编译时,objAA的类型被视为A类型,所以编译成功
//但运行时抛出java.lang.ClassCastException异常


对于引用类型中的数组引用类型,任何两个不同类型的数组之间不能进行类型的转换,但可以将数组转换为java.lang.Object类。
例如:
Object objArray = new Object();
int num_I[] = {1,2,3};
long num_L[] = {4,5,6};
num_I = num_L;      //编译出错,数组引用类型间不能自动进行类型转换
num_I = (int [])num_L; //编译出错,数组引用类型间不能进行强制类型转换
objArray = num_I;    //编译成功
objArray = num_L;    //编译成功

分享到:
评论
2 楼 supportopensource 2012-04-11  
xiaohuafyle 写道
写得不错,关于最后一点的引用数组的转换我没有看懂.
Object[] ins= {
	new Integer(0),
	new Integer(1),
	new Integer(2),
	new Integer(3),
};
Integer[] i = (Integer[]) ins;

这样的转换可以不可以呢?
实际上,执行这段代码,编译器是会报ClassCastException的.
可否赐教?
you can mail me, mark.wang.en@qq.com


这样是不可以的。
最后一点中,int[]之所以能够直接转换成object对象,是因为int[]的父类是Object。
你的代码里,
Object[]是一个对象数组,里面可以放任何对象,你上面放的是4个整型对象,下面我作了下修改,将其中的每一个对象分别转换成相应的对象是可以的:
      
Object[] ins= {      
    new Integer(0),      
    new String("abc"),      
    new Integer(2),      
    new Integer(3)     
};      
Integer i = (Integer) ins[0];      
String s =(String) ins[1];     

但是,将一个Object数组里的所有的对象全部转换成一种类型数组里的数据,有点不合理哦,而且Integer[] i是一个对象,只能引用了一个int型数组对象。
1 楼 xiaohuafyle 2012-04-11  
写得不错,关于最后一点的引用数组的转换我没有看懂.
Object[] ins= {
	new Integer(0),
	new Integer(1),
	new Integer(2),
	new Integer(3),
};
Integer[] i = (Integer[]) ins;

这样的转换可以不可以呢?
实际上,执行这段代码,编译器是会报ClassCastException的.
可否赐教?
you can mail me, mark.wang.en@qq.com

相关推荐

    值类型和引用类型的区别

    - 将值类型转换为引用类型的过程。 - 实际上是在托管堆上为引用类型分配内存,并将值类型的数据拷贝到该内存中。 - **拆箱**: - 将引用类型转换回值类型的过程。 - 从引用类型中获取值类型数据,并复制给值类型...

    浅谈C++中强制类型转换函数

    "C++强制类型转换函数详解" C++中强制类型转换函数是指使用强制类型转换操作符来实现类型转换的过程。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,即const_cast、static_cast、dynamic_cast和...

    C++类各种类型转换_数据类型的相互转换_

    首先,我们讨论隐式类型转换(也称为自动类型转换)。在C++中,当一个数据类型可以安全地被转换为另一种类型时,编译器会自动执行这种转换。例如,较小的数据类型(如int)可以被赋值给较大的数据类型(如long long...

    运行时类型信息RTTI及类型转换

    3. `reinterpret_cast`:提供最底层的转换,通常用于将指针或引用从一种类型转换为另一种完全不相关的类型,这可能导致不可预见的行为,除非非常了解底层内存布局。 在设计和编写多态的C++程序时,理解和利用RTTI...

    VC各种类型转换,很详细啊

    - `static_cast<类型>`:用于安全的静态转换,主要用于类层次结构间的指针或引用转换,以及标准C++库中的类型转换。 - `dynamic_cast<类型>`:用于运行时检查和类型转换,通常用于多态类对象的向下转型,以确保...

    值类型与引用类型(.html)

    在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和数据存储方式上有着显著的区别,这对于理解和优化代码性能至关重要。本文将深入探讨这两种类型的特性和应用场景。 1. 值类型(Value Types...

    深入分析java中的类型转换

    ##### 引用数据类型的隐式自动类型转换 - **小→大**: 引用数据类型之间的转换,例如子类到父类的转换。 - **转换示例**: 在Java中,可以通过多态来实现引用数据类型的隐式转换,例如将子类对象赋值给父类引用变量...

    引用类型与值类型的运算

    在探讨“引用类型与值类型的运算”这一主题时,我们需要深入了解JavaScript中两种基本的数据类型——值类型和引用类型,并理解它们之间如何进行运算。本文将根据提供的内容进行深入解析。 ### 引用类型与值类型的...

    《C#中的类型转换》

    在C#编程语言中,类型转换是至关重要的概念,它涉及到不同数据类型之间的转化,以适应不同的计算或存储需求。本文将深入探讨C#中的类型转换,包括装箱/拆箱、数值类型转换、字符编码、字符串与数字的转换、字符串与...

    C# 通用类型转换方法

    为此做了一个通用的类型转换方法,此方法能转换几乎所有简单的值类型以及实现了强制类型转换的引用类型,此方法利用反射和lambda实现,由于此方法是在大约2010年左右写的,当时个人知识有限对反射了解不深,没有将元...

    C# 的类型转换.doc

    - **装箱** 是将值类型转换为对应的引用类型,例如 `int` 转换为 `Int32`。 - **拆箱** 是相反的过程,将引用类型转换回值类型。 - **别名** 是指C#中简单数据类型(如 `int`、`short`、`long`)与系统类(如 `...

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

    2. **对象类型转换**:当需要将父类引用指向子类对象时,需要进行向下转型。例如,`Child child = (Child)parent;` 假设`parent`是一个`Parent`类型的对象,实际上是`Child`类型的实例。 需要注意的是,强制类型...

    c#数值类型,转换和装箱拆箱

    除了基本的数值类型转换,C#还提供了Convert类和TypeConverter类来进行类型间的转换。Convert类提供了各种静态方法,可以直接将一种类型转换为另一种类型,而TypeConverter类则用于自定义类型的转换规则。 在实际...

    vc.zip_c++类型转换_数据类型转换

    在C++编程语言中,类型转换是至关重要的概念,它允许程序员在不同数据类型之间进行操作。本资源“vc.zip”包含了一份关于C++类型转换的详细文档“vc.doc”,涵盖了从基本数据类型到复杂类型的转换方法。下面,我们将...

    BYTE类型之间相互转换

    如果你正在处理自定义类,可以通过定义构造函数或类型转换运算符来实现类型间的转换。例如: ```cpp class MyClass { public: MyClass(BYTE b) : byteValue(b) {} operator int() { return byteValue; } ...

    C ++类型转换心得

    1. 性能:不同类型转换的效率不同,尽量避免不必要的转换,特别是涉及指针或引用的转换,因为它们可能导致额外的内存拷贝。 2. 安全性:确保转换是安全的,例如,从 Variant 转换到具体类型前,检查其 VariantType...

    c#数据类型转换,BYTE,float,double,char类型间的转换方法.docx

    装箱是将值类型(如int)转换为对应的引用类型(如Int32),而拆箱则是相反的过程。在C#中,当你把一个值类型赋给一个对象引用时,就会发生装箱。例如: ```csharp int num = 10; object obj = num; // 装箱 int num...

    c++与pb的数据类型转换关系.txt

    本文通过具体的示例对比了C++与PowerBuilder的数据类型,并详细解释了如何在两种语言间进行类型转换。这将有助于开发者避免因数据类型不匹配而导致的问题,特别是在调用API或进行数据交互时尤为重要。 #### 二、C++...

    C#数据类型转换问题集锦

    C# 数据类型转换问题集锦 C# 数据类型转换是一个非常重要的概念,掌握好数据类型转换对于编程开发非常重要。本文将会对 C# 中的数据类型转换进行总结和分析,并提供了一些实用的代码示例。 在 C# 中,数据类型可以...

    VC++类型转换详解

    **VC++类型转换详解** 在VC++编程中,理解并熟练掌握不同类型间的转换至关重要,因为这直接影响到程序的正确性和效率。以下将详细介绍VC++中常见的数据类型以及它们之间的转换方法。 **一.VC常用数据类型列表** ...

Global site tag (gtag.js) - Google Analytics