一直以来都在用强转,但是突然间,发现了解得还不深入,此贴也接受相关的资源推荐,不要用法(我在网上找了哈说用法的多),
所谓的强转,倒底什么是强转,在内存中分生了什么变化,如下:
1)基础数据与基础数据的转换;
  我们知道,基础数据是直接划分一个空间,在里面存放了以下数据:数据类型,变量名,实际值(不对的地方请指证);
我如果强转是改变以上东西的什么东东:
2) 对象与对象的强转;
  我也知道,当我做这样操作时 Test a = new Test()时,内存做如下操作:
 划分一个Test内型的a空间,在里面存放Test类型,和a,然后new Test()生成一个具体对象把这个对象的内存访问地址(引用)符给a
  就是说,对于对象而言里面存的就是:类型地,变量名,对象的引用,当我们强转时内存做了哪些操作呢,

解决方案 »

  1.   

    对于变量它是有高到低转化,例如 double a 8位转到 int b 2 位,编译的时候是把a转化成二进制,然后取最低的二个字节。
    对于对象,它是子类直接强制成父类。class father ,class son, (father)son.
    son的自己的特色就淹没了,只能使用father的特色。
      
      

  2.   

    根据只重结果的原则:1)基本类型与基本类型的转换;在内存中直接按照目标类型格式去存放源数据,高->低 内存能放多少放多少,低->高 内存有多少剩多少...
    2)对象与对象的强转;对象间强转,是以父类属性/方法的空间去存放子类的属性和空间,内存能放多少放多少,子类有而父类没有的属性和方法就会被抛弃...
      

  3.   

    对于变量它是有高到低转化,例如   double   a   8位转到   int   b   2   位,编译的时候是把a转化成二进制,然后取最低的二个字节。 
    对于对象,它是子类直接强制成父类。class   father   ,class   son,   (father)son. 
    son的自己的特色就淹没了,只能使用father的特色。 
    回一楼,谢谢你的解答,但是我要问的什么是强转和强转时内存中发生了哪些变化,你说的都是强转后的结果,
      

  4.   

    基本数据类型强制转换时,内存是将存放数据空间的类型改变了。 
    而引用数据类型强制转换成基本数据类型时,是将内存的栈变成了堆。因为,栈是用来存放引用数据类型的, 
    而堆是用来存放基本数据类型的。 
    当然引用数据类型和基本数据类型的强制转换也就是内存堆栈之间的转换吧。回二楼,
    基本数据类型强制转换时,内存是将存放数据空间的类型改变了。 我也是这样子想的,
    而你说的后面我就持不同意见,因为堆中放的是new出来的对象,栈中放的才是我们的基础数据,比如说我们做这样一句话 Test t = new Test()是把t放在栈中,而把new Test()放在堆中的
      

  5.   

    根据只重结果的原则: 1)基本类型与基本类型的转换; 在内存中直接按照目标类型格式去存放源数据,高-> 低   内存能放多少放多少,低-> 高   内存有多少剩多少... 
    2)对象与对象的强转; 对象间强转,是以父类属性/方法的空间去存放子类的属性和空间,内存能放多少放多少,子类有而父类没有的属性和方法就会被抛弃...
    回4楼,前面相当不错了,但是2)的回答,我觉得有不同意见,Father f = null;
    f = (f)new son()照你这样说,f里面的东西不就是空的了,内存里面的改变还不清楚呢,
      

  6.   

    转型是因为类的多态
    每一态表示一种interface
    不管怎么转 对象内部肯定不变想象绘画  2个图层 一个全部画面的 内容层  一个是显示用的 遮罩层也就是我们最后看见的不是最下面的层  而是遮罩层显示出来的部分
    底层不变 只要换 遮罩层就可以看见不同的式样所以 转型就看 支持几个 遮罩层 任意一个新建立的类 至少 支持 自己和OBJECT 2个数值类型 应该也是对象 我想从概念上说 他可能不属于 OBJECT这样的类型 派生出来的对象
    数值类的转型 应该叫转换 每个基本数据类型占用规定的空间
    当从A空间搬到B空间 如果 空间大小不一致的话 B空间比A空间小 装不进的只能扔掉 那肯定是强转了(溢出)
    如果 B空间大于等于A空间 我想就不用强转了把直接 塞进去就可以了
      

  7.   

    回楼主:
    你在9楼的这个例子不大清楚,假如类Son继承自类Father,按楼主代码这么做肯定是错的.Father f = null; 
    f = (f)new son();
    要么是这种情况:Father f = null;  //声明了一个Father型的引用f,但是没有指向任何地方
    f = new Son();    //把这个引用指向一个Son型的类对象(这时堆内存中实际放的是Son的类对象)那么其实它就是一句Father f = new Son();  //以父类的类型声明,而内存中实际(堆内存中存放的是Son的类对象,只不过它的引用是Father型的)这里并没有强制转换发生.或者楼主是想说这种情况:Father f = null;          //声明了一个Father型的引用f,依然没有指向任何地方f = (Father)new Son();    //首先,把这个引用指向一个Son型的类对象
                                  //然后,把Son型的类对象,按照我说的2)情况,以父类Father的格式在堆内存中存放
                                  //这时,子类特有的属性和方法都被抛弃
                                  //最后的结果,引用f,指向父类Father的类对象.这种情况不清楚Java编译或者JVM是否会优化.
    按照=赋值最后的情况来看
    假如没有优化:
    首先,在堆内存中新建一个Son类的对象,将属性和方法都存放进去.也就是说按Son对象的格式开辟一片空间
    然后,对这个对象进行(Father)的强制转换,把Son对象的空间按2)的情况,重新存放,Son中独有的(也就是Father中没有的)属性和方法被抛弃.
    最后,把Father型引用指向这个对象.如果这段代码被Java或JVM优化了,可能会不进行强转直接创建一个Father对象,然后把引用f指过去.
    ---------------------------------------------------------------------------------------------------以上个人观点,仅供参考
      

  8.   

    强也有个强弱的比较,Java的转化基本都不强,因为它是强类型的,C/C++的强转可以称为乱转,猫可以变成狗。