多态类型转化

AC_YE 2021-03-24 09:56:37
为什么a强转成狗类型后,a =new Cat1()a就变成Cat1对象了,a不是狗类型了吗,那么不就是狗类型new了一个猫类型了吗
...全文
388 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2021-03-30
  • 打赏
  • 举报
回复
引用 7 楼 Helloworld… 的回复:
[quote=引用 2 楼 hhhksz01的回复:]你这里是新初始化了一个cat类型重新给a赋值了吧,那自然是变成了cat类型了
但是能赋值吗,a已经转换成Dog了,再new一个cat赋值给Dog,能这样吗[/quote] a能转dog 因为a 本身是dog类,只不过通过向上转型可以赋予 animal,所以 这里不是a 转成dog ,这里是a还原成本身。 转型只能下转上,也就是子类转父类, 父类转子类是不可以的,你想把 cat转dog是行不通的, 因为cat转为animal后,animal无法再转为dog,所以cat无法转dog
viewgroup 2021-03-26
  • 打赏
  • 举报
回复
引用 6 楼 Helloworld… 的回复:
[quote=引用 1 楼 Squall1009的回复:]A只是一个ANIMAL的引用 它可以指向animal或者任何animal的子类
可是a已经转换成Dog了呀,Dog不能new一个cat吧[/quote] 不是的,A不是dog a 还是animal 只不过a 指向的内存里面存放着一条狗
Squall1009 2021-03-25
  • 打赏
  • 举报
回复
你的a并不是对象 在java里 叫做对象的引用
AC_YE 2021-03-25
  • 打赏
  • 举报
回复
引用 2 楼 hhhksz01的回复:
你这里是新初始化了一个cat类型重新给a赋值了吧,那自然是变成了cat类型了
但是能赋值吗,a已经转换成Dog了,再new一个cat赋值给Dog,能这样吗
AC_YE 2021-03-25
  • 打赏
  • 举报
回复
引用 1 楼 Squall1009的回复:
A只是一个ANIMAL的引用 它可以指向animal或者任何animal的子类
可是a已经转换成Dog了呀,Dog不能new一个cat吧
AC_YE 2021-03-25
  • 打赏
  • 举报
回复
a不是转换成Dog类型了吗,然后a=new Cat,这不就是相当于Dog a = new Cat是这样吗
起名伤脑 2021-03-25
  • 打赏
  • 举报
回复
你弄混了,狗和猫之间是没有关系的,但他们都属于Animal1下的子类,你可以试下将a = new Cat1()放到Animal1 a=new Dog1上面, 这样你是不是就认为转成cat之后,再转成dog,其实他会报类转换异常错,是因为狗和猫之间是没有关系, 你后面新new一个猫,a = new Cat1() 只是父类引用a刚开始指向子类dog对象然后后面发生了改变,变成cat
qybao 2021-03-25
  • 打赏
  • 举报
回复
你可以把a想象成是一条狗链 a=new Dog1是把狗链拴在了狗身上,所以通过a去找到的对象就是狗 a=new Cat1是重新把狗链拴在了猫身上,所以通过a找到的对象就是猫
KeepSayingNo 2021-03-25
  • 打赏
  • 举报
回复
new dog1() 和 new cat()是创建了一个对象,存放在堆上,Animal a是声明了一个局部变量,这个局部变量在声明的时候先入栈,赋值操作时将a指向堆上的对象,第二次赋值cat时是将指针重新指向cat对象
qybao 2021-03-25
  • 打赏
  • 举报
回复
引用 5 楼 Helloworld… 的回复:
a不是转换成Dog类型了吗,然后a=new Cat,这不就是相当于Dog a = new Cat是这样吗
a只是个变量,不是具体的对象,它只是跟对象绑定,就好比我上面打比方的狗链。你赋什么值给变量,变量就是什么值(当然能赋值的前提就是类型一致,a是Animal类型,猫和狗也是Animal对象,类型一致,所以可以赋值) 赋值就是往变量内存里存放东西,重新赋值,就意味着变量内存之前的内容被擦去,然后被改写成新的内容 Animal a = new Dog1 是把狗赋给了a,此时a就连着狗 Animal b = a 你可以把a赋给b,此时b也连着狗 a = new Cat1 然后把猫赋给a,此时a被被切断和狗的连接,重新连着猫(内存信息被更新) System.out.println(a==b) 你可以查看a和b是不是还相同(一个连着狗,一个连着猫)
天际漫游者 2021-03-24
  • 打赏
  • 举报
回复
你这里是新初始化了一个cat类型重新给a赋值了吧,那自然是变成了cat类型了
Squall1009 2021-03-24
  • 打赏
  • 举报
回复
A只是一个ANIMAL的引用 它可以指向animal或者任何animal的子类

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧