A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 年轻的棒棒 中级黑马   /  2013-4-21 15:13  /  1492 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 年轻的棒棒 于 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所指向的内容,为什么要转啊。如果不是,那是多少啊!

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

3 个回复

倒序浏览
当执行Zi z=(Zi) f,首先f不是Zi类的对象,所以f的地址和Zi创建的对象的地址是不一样的,没创建一个对象,java虚拟机都会为其重新分配一个新的地址,当进行赋值时,仅仅是将要赋值的对象指向了该对象的地址或者引用,但是如果你不执行强转,要赋值的变量名或者对象名是不会将地址指向已经创建的对象的。
回复 使用道具 举报
1.子类对象已建立,不过是父类引用还是子类自身引用指向它,地址应该就已经确定,所以类型转低指向的对象是不便的,因而的地址在这个过程没有改变。

2.这个多态的要点你需要掌握的是,父类引用指向子类对象是有局限性的,就是父类引用只能调用父类或者子类复写的方法,而不能调用子类特有方法。

希望可以帮助到你。有问题请继续追问
回复 使用道具 举报
同意#2的回答,其实这个问题是可以自己用一个小代码就可以解决的:
比如
  1. Fu f=new Zi();
  2. Zi z=(Zi)f;
  3. 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是一样的了

所以,引用通过地址找到对象,再判断作用域来调用对象方法的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马