jvm强制类型转换
public class Integer_Object {
public static void main(String[] args){
Object obj = new ooo();
// Integer i = (Integer) obj;
Integer i = Integer.parseInt(obj.toString());
System.out.println(i);
}
}
class ooo{
public String toString(){
return +"";
}
}
//上述转换中:注释掉的为错误的转换
以上为以前的转载问题; 重新整理时发现这样的转换并没有意思,ooo对象跟integer并不是兼容的类型(Java中强制类型转换的实现机制),调用了tosting()实际上是相当于一个新的String类型,之后引发思考想了解一下java的强制类型转换的jvm实现:
java强制类型转换的JVM的实现
首先狭义上的强制类型转换,我指的是引用类型,且是父类向子类转换,这种转换只牵扯到引用名义类型的转换,具体的对象内存没有发生一点变化。
而基本类型的转换与此不同,其数据确实发生了变化,但是基本类型并不是对象。如果是基本类型和其包装类的相互转化,实际上调用是Integer.parseInt()和Integer.valueOf()来完成。
父类向子类进行强制转换,如果成功不会有任何数据丢失,如果不是其子类,那么会报错。
基本类型之间的转换,如果是大范围的向小范围的转换,确实有可能会发生数据丢失或精度丢失。
来源:知乎 http://www.zhihu.com/question/37114869/answer/70514195
public class Integer_Object {
public static void main(String[] args){
ooo sup = new ooo();
oooo sub = (oooo) sup;//运行会出现异常信息:ooo cannot be cast to oooo
System.out.println(sup instanceof oooo);//false
ooo sup1 = new oooo();
oooo sub1 = (oooo) sup1;//这个sup1对象实例在内存中的本质还是oooo类型的,只不过它的能力临时被消弱了(向上转型)而已,如果我们想变强怎么办?将其对象类型还原!
System.out.println(sup instanceof oooo);//true
//总:所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。
}
}
class ooo{
}
class oooo extends ooo{
}
more:
Java instanceof 关键字是如何实现的?
Java类加载器总结
深入分析java ClassLoader
java ClassLoaders Tutorial
jvm强制类型转换的更多相关文章
- 【JAVA】笔记(1)---JVM内存图;方法重载条件;输入方法;转义字符;强制类型转换;变量分类及区别;Java命名规范;
Java命名规范: 1.包:全部字母小写: 2.类+接口:所有单词的首字母大写: 3.变量+方法:第一个单词的首字母小写,其余单词首字母大写: 3.常量名:所有字母均大写,且用下划线" _ ...
- scala object 转Class Scala强制 类型转换
scala object 转Class Scala强制类型转换 asInstanceOf[T] 将对象类型强制转换为T类型. 还是由于泛型存在类型擦除的原因,1.asInstanceOf[Stri ...
- java中强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- C++强制类型转换
C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...
- java提高篇(十一)-----强制类型转换
在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- JavaScript学习10 JS数据类型、强制类型转换和对象属性
JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...
- C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...
- C++强制类型转换操作符 const_cast
const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...
- C++强制类型转换操作符 static_cast
static_cast是一个强制类型转换操作符.强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast.dynamic_cast.const_cast.reinterpert ...
随机推荐
- js判断是否安装flash
<script type="text/javascript"> (function () { var noFlash = "你的浏览器没有安装Flash,会影 ...
- UIView和其子类的几个初始化函数执行的时机
-(id)initWithFrame:(CGRect)frame - UIView的指定初始化方法; 总是发送给UIView去初始化, 除非是从一个nib文件中加载的; -(id)initWithCo ...
- J - A + B Problem II(第二季水)
Description I have a very simple problem for you. Given two integers A and B, your job is to calcula ...
- CATCell <——>CATPoint
假定原先有CATCell tCell; CATVertex_var spVertex = tCell; CATPoint_var spPoint = spVertex -> GetPoint() ...
- 合理的使用size_t可以提高程序的可移植性和代码的可读性,让你的程序更高效。
最近研读STL源码时,发现里面有很多ptrdiff_t类型的数据,这与size_t的作用类似.以下是一篇关于size_t等平台无关类型的作用,写得很清楚.特将其记录下来. http://blog.cs ...
- Loader之一:基本原理
参考APIDEMO及http://developer.android.com/guide/components/loaders.html#app 1.Introduced in Android 3.0 ...
- Asp.net SignalR 初试和应用笔记一 认识和使用 SignalR
如果你在用QQ,微信.你会知道,广告和消息无处不在.也有好的一面,比如通过QQ或微信,微博等及时聊天功能,你找到了你的初恋,你找到了小学的班级等等. 这里的及时通信在很多应用场所能用到,比如: 1.球 ...
- ecshop各个文件夹作用
Images文件夹: 这个文件夹下有子文件夹,在这些子文件夹下面存放着当前网站商品的原始图片和缩略图.这些子文件夹命名有规律的,它们的文件名是它们目录下商品加入 的年月份.也就是说在同一个月份加入的商 ...
- Python之路第六天,基础(7)-正则表达式(re)
Python RE模块(正则表达式) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成 ...
- C语言基础11
函数指针的定义: 函数类型 (标识符 指针变量名)(形参列表) void printHello( ); void printHello( ){ printf("hello world!!! ...