黑马程序员技术交流社区
标题:
多态中,类型强转
[打印本页]
作者:
年轻的棒棒
时间:
2013-4-21 15:13
标题:
多态中,类型强转
本帖最后由 年轻的棒棒 于 2013-5-21 10:19 编辑
class Fu
{
void show(){
System.out.println("Fu show");
}
}
class Zi extends Fu
{
void show(){
System.out.println("Zi show");
}
class A
{ public static void main(String[] args){
Fu f=new Zi();
f.show();
}
}
在创建Zi类对象时,其地址是0x0034,所以f指向的地址是0x0034,当有语句,Zi z=(Zi) f时,z所指的还是0x0034么,如果是,那都是使用的0X0034所指向的内容,为什么要转啊。如果不是,那是多少啊!
作者:
王怀亮
时间:
2013-4-21 15:20
当执行Zi z=(Zi) f,首先f不是Zi类的对象,所以f的地址和Zi创建的对象的地址是不一样的,没创建一个对象,java虚拟机都会为其重新分配一个新的地址,当进行赋值时,仅仅是将要赋值的对象指向了该对象的地址或者引用,但是如果你不执行强转,要赋值的变量名或者对象名是不会将地址指向已经创建的对象的。
作者:
聖手`书生
时间:
2013-4-21 15:52
1.子类对象已建立,不过是父类引用还是子类自身引用指向它,地址应该就已经确定,所以类型转低指向的对象是不便的,因而的地址在这个过程没有改变。
2.这个多态的要点你需要掌握的是,父类引用指向子类对象是有局限性的,就是父类引用只能调用父类或者子类复写的方法,而不能调用子类特有方法。
希望可以帮助到你。有问题请继续追问
作者:
Neverbelazy
时间:
2013-4-21 23:36
同意#2的回答,其实这个问题是可以自己用一个小代码就可以解决的:
比如
Fu f=new Zi();
Zi z=(Zi)f;
System.out.println("z==f?"+"::"+(z==f));
复制代码
1.输出显示是真,那么说明确实地址是不变的。
2.不能认为引用就是一个地址值; 引用还定义了“作用域”(应该有更专业的说法),
3. 一个比喻:引用就像一个遥控器,而对象是这个遥控器控制的对象。
Zi z=new Zi(); 相当于你拿到了一个新版本的遥控器z 去控制新版本的对象。这个遥控器上按键可以实现新对象的很多新功能和旧功能。
Fu f=new Zi(); 相当于你只拿到了一个旧版本的遥控器f, 而去控制新版本的对象。这个控制器上的功能少,不能实现新的对象的很多新的功能只能实现旧的功能。
Zi z1=(Zi)f; 相当于把遥控器升级了,新的遥控器z1和z是一样的了
所以,引用通过地址找到对象,再判断作用域来调用对象方法的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2