jvm强制类型转换

Posted FEI_>.<_JI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 1+"";
    }
}

//上述转换中:注释掉的为错误的转换

以上为以前的转载问题;  重新整理时发现这样的转换并没有意思,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类加载器总结

 

 

 

 

 

 

 

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

java类型转换详解(自动转换和强制转换)

入门的知识点

在代码片段中包含类型转换

JVM-Java 的基本类型

无法将整数强制转换为android.support.design.widget.FloatingActionButton

数据类型转换之强制类型转换