- 浏览: 522014 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (114)
- C基础 (1)
- C指针 (0)
- C语言库函数相关 (1)
- Linux (2)
- Linux网络编程 (1)
- PostgreSQL (0)
- Redis (2)
- Java Web (2)
- JAVA基础 (35)
- Ubuntu (8)
- Android (2)
- MySQL (3)
- 日志 (1)
- 书虫 (1)
- 数据结构 (0)
- 算法 (0)
- 开发工具 (1)
- 转载 (13)
- 英语 (18)
- tomcat启动脚本分析 (3)
- Oracle基础 (4)
- tomcat源码分析 (3)
- tomcat (1)
- Java相关 (1)
- Oracle基本原理--Oracle体系结构 (0)
- Oracle基本原理--表 (0)
- Oracle基本原理--索引 (0)
- Oracle基本原理--事务 (0)
- Oracle开发--SQL (1)
- Oracle基本原理--PL/SQL (0)
- Oracle基本原理--常用函数 (0)
- Oralce管理--用户及权限管理 (0)
- Oracle管理--安装调试 (0)
- Oracle管理--备份恢复 (0)
- Oralce管理--数据迁移 (0)
- Oracle管理--闪回 (0)
- Oracle管理--故障处理 (0)
- Oracle优化原理--统计信息 (0)
- Oracle优化原理--执行计划 (0)
- Oracle优化原理--诊断工具 (0)
- Oracle优化原理--深入理解表 (0)
- Oracle优化原理--深入理解索引 (0)
- Oracle优化原理--表连接原理 (0)
- Java--OOP (0)
- Java--异常 (0)
- Java--泛型 (0)
- Java--集合 (0)
- Java--IO (0)
- Java--枚举类型 (0)
- Java--注释 (0)
- Java--多线程 (0)
- Java--XML (0)
- Java--JDBC (3)
- Servlet (0)
- JSP (0)
- JSTL (0)
- 设计模式 (0)
- DAO与MVC (0)
- Javascript (2)
- Ajax (0)
- JQuery (0)
- HTML/CSS (0)
- 前端相关 (1)
- HTTP (0)
- TCP/IP (0)
- GO基础 (0)
最新评论
-
jsonmong:
推荐一个开发平台,采用的是插件化的设计思想,效果很不错的。ht ...
构建Java Web开发环境 -
wxm198427:
首先表示辛苦了!我想问个问题:我的是windows 7 x64 ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
握着橄榄枝的人:
我之前按照你的update mysql.user set pa ...
Windows7下MySQL5.5.20免安装版的配置 -
confident_f:
安装了32的客户端后,用plsql导入导出表有问题,生成不了d ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
confident_f:
安装数据库的时候第9步卡住了 是怎么回事呢?
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤
引用类型间的转换有自动类型转换和强制类型转换两种。对于类引用类型,只有具有继承关系的类,即父类与子类之间,才可以进行类型的转换。
当引用了某个子类的变量对引用该子类的父类的变量赋值时,会自动进行类型的转换;反之,父类对子类进行赋值时则需要进行强制类型转换。
例如,A为父类,B、C分别继承自类A,分别定义引用这3个类的变量,然后进行各种赋值操作。
定义引用变量:
● 子类对父类进行赋值:
● 父类对子类进行赋值:
● 两个子类间的赋值:
如果两个不同的子类继承自同一个父类,那么这两个子类之间也不能进行类型转换,因为它们之间没有直接或间接的继承关系。
● 如果声明了一个父类型的变量,但使其引用子类对象,在编译时,java编译器是根据变量被显示声明的类型去编译,因此该变量的类型被看作父类类型。然后将其进行强制类型转换并赋给引用了另一个子类对象的变量时编译成功,但运行时将抛出java.lang.ClassCastException异常,因为这个变量实际引用的是子类对象,两个子类属于不同的类型,也没有继承关系,所以不能将一个子类强制转换为另一个子类。
对于引用类型中的数组引用类型,任何两个不同类型的数组之间不能进行类型的转换,但可以将数组转换为java.lang.Object类。
例如:
这样是不可以的。
最后一点中,int[]之所以能够直接转换成object对象,是因为int[]的父类是Object。
你的代码里,
Object[]是一个对象数组,里面可以放任何对象,你上面放的是4个整型对象,下面我作了下修改,将其中的每一个对象分别转换成相应的对象是可以的:
但是,将一个Object数组里的所有的对象全部转换成一种类型数组里的数据,有点不合理哦,而且Integer[] i是一个对象,只能引用了一个int型数组对象。
当引用了某个子类的变量对引用该子类的父类的变量赋值时,会自动进行类型的转换;反之,父类对子类进行赋值时则需要进行强制类型转换。
例如,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 写道
写得不错,关于最后一点的引用数组的转换我没有看懂.
这样的转换可以不可以呢?
实际上,执行这段代码,编译器是会报ClassCastException的.
可否赐教?
you can mail me, mark.wang.en@qq.com
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
写得不错,关于最后一点的引用数组的转换我没有看懂.
这样的转换可以不可以呢?
实际上,执行这段代码,编译器是会报ClassCastException的.
可否赐教?
you can mail me, mark.wang.en@qq.com
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
发表评论
-
foreach循环
2013-06-24 16:15 1497从JDK1.5开始,Java提供了一个更简单的循环:forea ... -
可变参数
2013-06-24 15:38 1225从JDK1.5开始,Java允许使用可变参数为方法指定数量不确 ... -
泛型(core java 笔记)
2013-06-18 16:18 20741.为什么引入泛型 package generic; ... -
两个程序的说明
2010-10-19 09:26 11671、程序1的结果是: clas ... -
构造器初始化
2010-10-18 14:42 1535可以用构造器来进行初始化。在运行时刻,可以调用方法或执行某些动 ... -
成员初始化
2010-10-18 07:55 1247Java尽力保证:所有变量在使用前都能得到恰当的初始化。 对 ... -
线程的死锁
2010-10-11 19:21 1524当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚 ... -
线程的同步
2010-10-11 19:00 1290一个经典的关于线程安全性的问题:银行取钱问题。 银行取钱的基 ... -
java网站收集
2010-10-10 18:13 1295JAVA开发者最常去的25个英文网站:http://www.i ... -
控制线程
2010-10-10 16:06 20271、线程睡眠:sleep 如果我们需要让当前正在执行的线程暂 ... -
线程的状态
2010-09-28 19:00 1078线程从创建到执行完毕的整个过程称为线程的生命周期,在整个生命周 ... -
Java中Thread类的start()和run()的区别
2010-09-27 15:33 41391、start()方法来启动线程,真正实现了多线程运行,这时无 ... -
Java中创建线程的两种方法
2010-09-26 10:18 5648在Java中创建线程有两种方法:继承Thread类和实现Run ... -
创建String对象过程的内存分配小结
2010-09-23 20:32 2796常量池(Constant Pool):指的是在编译期被确定,并 ... -
Java堆和栈的区别 经典总结(转载)
2010-09-18 16:48 1289栈与堆都是Java用来在Ram中存放数据的地方。 与C++不 ... -
Java初学者都必须理解的七大问题
2010-09-18 10:36 1134问题一:我声明了什么 ... -
关于计算java程序运行时间(转载)
2010-09-18 09:22 1136//第一种,伪代码 long startTime= ... -
for循环的优化
2010-09-17 20:29 2159在程序中经常用到for循环,当一些算法实时性要求非常高时,对f ... -
详细解析Java中抽象类和接口的区别(转载)
2010-09-17 10:16 1127在Java语言中,abstract class和inter ... -
集合类(四):Map集合
2010-09-16 20:26 21555、Map集合 Map集合为映射类型,映射与集和列表有明显的区 ...
相关推荐
- 将值类型转换为引用类型的过程。 - 实际上是在托管堆上为引用类型分配内存,并将值类型的数据拷贝到该内存中。 - **拆箱**: - 将引用类型转换回值类型的过程。 - 从引用类型中获取值类型数据,并复制给值类型...
"C++强制类型转换函数详解" C++中强制类型转换函数是指使用强制类型转换操作符来实现类型转换的过程。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,即const_cast、static_cast、dynamic_cast和...
首先,我们讨论隐式类型转换(也称为自动类型转换)。在C++中,当一个数据类型可以安全地被转换为另一种类型时,编译器会自动执行这种转换。例如,较小的数据类型(如int)可以被赋值给较大的数据类型(如long long...
3. `reinterpret_cast`:提供最底层的转换,通常用于将指针或引用从一种类型转换为另一种完全不相关的类型,这可能导致不可预见的行为,除非非常了解底层内存布局。 在设计和编写多态的C++程序时,理解和利用RTTI...
- `static_cast<类型>`:用于安全的静态转换,主要用于类层次结构间的指针或引用转换,以及标准C++库中的类型转换。 - `dynamic_cast<类型>`:用于运行时检查和类型转换,通常用于多态类对象的向下转型,以确保...
在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和数据存储方式上有着显著的区别,这对于理解和优化代码性能至关重要。本文将深入探讨这两种类型的特性和应用场景。 1. 值类型(Value Types...
##### 引用数据类型的隐式自动类型转换 - **小→大**: 引用数据类型之间的转换,例如子类到父类的转换。 - **转换示例**: 在Java中,可以通过多态来实现引用数据类型的隐式转换,例如将子类对象赋值给父类引用变量...
在探讨“引用类型与值类型的运算”这一主题时,我们需要深入了解JavaScript中两种基本的数据类型——值类型和引用类型,并理解它们之间如何进行运算。本文将根据提供的内容进行深入解析。 ### 引用类型与值类型的...
在C#编程语言中,类型转换是至关重要的概念,它涉及到不同数据类型之间的转化,以适应不同的计算或存储需求。本文将深入探讨C#中的类型转换,包括装箱/拆箱、数值类型转换、字符编码、字符串与数字的转换、字符串与...
为此做了一个通用的类型转换方法,此方法能转换几乎所有简单的值类型以及实现了强制类型转换的引用类型,此方法利用反射和lambda实现,由于此方法是在大约2010年左右写的,当时个人知识有限对反射了解不深,没有将元...
- **装箱** 是将值类型转换为对应的引用类型,例如 `int` 转换为 `Int32`。 - **拆箱** 是相反的过程,将引用类型转换回值类型。 - **别名** 是指C#中简单数据类型(如 `int`、`short`、`long`)与系统类(如 `...
2. **对象类型转换**:当需要将父类引用指向子类对象时,需要进行向下转型。例如,`Child child = (Child)parent;` 假设`parent`是一个`Parent`类型的对象,实际上是`Child`类型的实例。 需要注意的是,强制类型...
除了基本的数值类型转换,C#还提供了Convert类和TypeConverter类来进行类型间的转换。Convert类提供了各种静态方法,可以直接将一种类型转换为另一种类型,而TypeConverter类则用于自定义类型的转换规则。 在实际...
在C++编程语言中,类型转换是至关重要的概念,它允许程序员在不同数据类型之间进行操作。本资源“vc.zip”包含了一份关于C++类型转换的详细文档“vc.doc”,涵盖了从基本数据类型到复杂类型的转换方法。下面,我们将...
如果你正在处理自定义类,可以通过定义构造函数或类型转换运算符来实现类型间的转换。例如: ```cpp class MyClass { public: MyClass(BYTE b) : byteValue(b) {} operator int() { return byteValue; } ...
1. 性能:不同类型转换的效率不同,尽量避免不必要的转换,特别是涉及指针或引用的转换,因为它们可能导致额外的内存拷贝。 2. 安全性:确保转换是安全的,例如,从 Variant 转换到具体类型前,检查其 VariantType...
装箱是将值类型(如int)转换为对应的引用类型(如Int32),而拆箱则是相反的过程。在C#中,当你把一个值类型赋给一个对象引用时,就会发生装箱。例如: ```csharp int num = 10; object obj = num; // 装箱 int num...
本文通过具体的示例对比了C++与PowerBuilder的数据类型,并详细解释了如何在两种语言间进行类型转换。这将有助于开发者避免因数据类型不匹配而导致的问题,特别是在调用API或进行数据交互时尤为重要。 #### 二、C++...
C# 数据类型转换问题集锦 C# 数据类型转换是一个非常重要的概念,掌握好数据类型转换对于编程开发非常重要。本文将会对 C# 中的数据类型转换进行总结和分析,并提供了一些实用的代码示例。 在 C# 中,数据类型可以...
**VC++类型转换详解** 在VC++编程中,理解并熟练掌握不同类型间的转换至关重要,因为这直接影响到程序的正确性和效率。以下将详细介绍VC++中常见的数据类型以及它们之间的转换方法。 **一.VC常用数据类型列表** ...