java中向上转型,向下转型,强制类型转换的原理?

......
class B extends A
......
A x ; B y;
// x=new B(); (1)
// y=new A(); (2)
// x=new A(); y=(B)x; (3)
// y=new B(); x=(A)y; (4)

请问:
1,(1)-(4)四条语句,哪些能正确编译,哪些能正确运行?为什么?
2,对象声明(A x;)和创建( x=new A();)有什么区别?
3,强制类型转换是什么原理?什么时候可以使用强制类型转换?它会导致哪些内存分配方面的变化?

我对对象声明和创建,以及转型等导致的关于内存分配等方面的具体变化一直不太懂,希望能说得更清楚一些?,非常感谢。

第一个OK,可以正确编译,可以正确运行,因为X是A,A是B的父类,所以当然你构造一个B,相当于也就是构造了一个A所以,X可以赋值到一个B的实例。最简单理解,就是任何一个对象都是Object的子类,你可以定义一个Object来看。
第二个就不行,不能编译,也不能运行。都是要求你要做强制转换
第三个可以编译,也可以运行,只是有可能在你使用y的时候报错
第四个也可以编译,也可以运行,因为这个B就是A的子类,所以当然可以当作一个A来用。

第2个,声明对象只是说x,是A这个类型的。但是构建的时候,才是创建实例的时候。好比你声明一个x是A 类,这个时候,你就可以后面给他赋值到所有A类当中的任何一个实例。而new A();只是创建一个A的实例,来赋值,这是众多赋值方法的一种

第三个,强制转换的原理,就是一个类,需要他用什么定义来使用,就转换成这个定义后,再继续使用。因为本质上一个类都是存储在内存里的,按照固定格式,有些时候程序自身是不知道的,只有你自己清楚。最常用的地方,就是把一个类放入Map里面,再取出来的时候,只有你自己知道里面放的是什么,所以要强制类型转换后,才可以接着用。内存分配方面不会有任何变化,你基本不用操心。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-26

    1可以

        2不行

        3不行

        4 可以

        就是向上转型的问题啊。子类型可以向上转。父类型不能向下转。

2    A x在栈中创建了一个引用,x=new A();还在堆中创建了一个实体,然后指向x。

3  这个还很难啊,原理实际上和jvm有关的,具体我不大清楚,内存变化也是这样的,要看虚拟机了。

第2个回答  2013-03-26
1, (1)(4),子类可以强转成父类
2, A x只是声明一个 引用(放在堆栈)
x = new A() ;首先在内存中创建一个对象A 然后将引用x 指向 内存中的对象A

3,java的新特性(泛化)本回答被网友采纳
第3个回答  2013-03-26
(1),2编译出错, 3运行出错
(2),变量的声明意味着分配了小块内存,该内存将用来保存一个对象所占据内存的地址,该内所保存的是一个所声明类型的变量 ;变量初始化意味着系统给这个对象占据的内存分配了足够的地址,设置好了相关信息,并且将这个对象占据的内存地址保存在上述小块内存中
(3),从具体到抽象或者说从小范围到大范围,安全
从抽象到具体或者说从大范围到小范围,风险
之所以只是风险,是java中抽象(大范围)类型的外表下藏匿着具体(小范围)类型的内在,未知。
具体详细需要了解还是去查阅其资料吧,网上牛人的博客很多

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网