Java Object

A a=new B();这一句代码分为三步:
1、A a:声明了一个A类型的变量a(a是放在栈的一个变量);
2、new B()创建一个B对象(当然会开辟一个内存空间存放在堆里);
3、=:把变量a指向堆空间的某一块;


A a=new B();只能是以下有两种情况:1.A是类,那么B类一定从A类继承,A是父类,B是子类,两个类之间是继承关系;2.A是接口,那么B类实现了A接口,A可以说是父接口,B是A的实现类,B也可以说是A的子类两者是实现关系。-------不论是以上那种,A a=new B(); 都叫做向上转型,或者说 父类引用指向子类对象。因为A与B之间,不论是实现关系还是继承关系,A都是B的父类,或父接口,其实从本质上讲,A就是B的父类,因为接口也是一个类,只不过是个抽象类,而且是一个特殊的抽象类,你就这么理解,就理解为父类和子类的关系就可以了。-------那么A a,这个a叫什么?叫做引用或者叫引用变量,a就是一个变量,那么为什么术语要叫引用呢?

因为A是引用数据类型,假如我给你举个例子:int i; 这个,int是基本数据类型,i是一个变量,是内存中的一块空间,说清楚点就是,内存的存储体本身就好像有好多个小格子一样,每一个小格子叫做一个存储单元,每一个存储单元能够存储8位,或者16...32位的01序列,也就是机器码,那么将来你为i赋值之后,这个值本身比如说8,那么8所对应的2进制数是1000 ,如果是8位那么就是00001000,就存储在那里了,也就是这个值就本身就存储在这个内存空间之上!-------但是如果是引用类型就不是了,A a=new B(); 不是说a这个变量的内部存储了对象B,不是的。Java中使用new关键字造出一个对象,这里就造出了一个B对象,这个对象位于内存的堆区,变量a和B对象可能不在同一个空间,堆内存有一个对象B,那么a里面的值是什么?

答案补充
a内部有一个值,值就是一个地址,这个地址是什么样的一个数你不用管,你就知道通过这个地址就可以准确的访问到B对象就可以了,因为内存中每一个存储单元都有一个编号,这是什么?这是指针!Java中到处都是指针,只不过Java把这一层屏蔽了!也就是a内部存储的这个地址并不是真正的物理地址,但是不管怎么说,我们通过a内部的这个地址都可以找到这个对象,它内部是什么算法,我就不知道了。

答案补充
所以,我们就说,a是一个引用,a这个引用指向了B对象,以后想通过B对象为你做什么事,你得通过a。那么a是什么类型的?a是A类型的,A是谁?A是B的父类,那么这就是父类引用指向子类对象,也叫向上转型(upcasting)

答案补充
向上转型会丢失其原有类型,是这样:如果A是一个类,子类B在构造的过程中会调用其基类构造方法,先把父类A给new出来,然后再把自己new出来,也就是说B类对象中有一个A类对象,B对象内部包含了一个A对象,B对象比A对象大。那么向上转型之后,你通过A类型的引用a,只能访问到B对象里面的A对象,也就是a只能看见A Object

答案补充
你这个问题太强悍!真的,其实就这么一个问题,能够写一本书,以下是假设A和B均是class的情况下的内存图,并且假设A a=new B();是写在main方法中的,自己看吧:

父类引用指向子类对象

A是B的父类,可以把A的子类对象赋值给父类引用。B会向上转型为A!所以引用a不能调用B中的方法,只能调用A中的方法。如果要用B的方法可以先向下转型再调用。如:(B)a.子类方法答案补充
不是(B)a.子类方法,是((B)a).子类方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值