JAVA多态中父类引用子类对象

骜沉 2021-05-14 09:43:59
父类引用存放的是子类的地址,不应该调取子类的变量和方法吗?为啥调取的是父类的所有变量和方法(或子类重写父类的方法)
...全文
273 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
得一以生 2021-05-14
  • 打赏
  • 举报
回复
父类A,属性a1,方法a2,这个是在A.java中定义的。 子类B继承A,属性b1,方法b2,从A继承得到a1,a2 然后你用A a = new B(); 这行代码可以分为两步 1、A a; 定义了一个引用a,是类A的引用,所以a所拥有的只有a1和a2,这个时候还没有指向内存中的某个对象 2、a = new B();将类B的一个对象new B()指向引用a,这个时候有一个默认的向上转型,但是由于b1和b2是定义在B.java里的,与a无关,属于B自己拥有的,只有B的引用才可以使用,A的引用无权使用。 这个是在代码编译期就已经确定的,所以编译无法通过。
骜沉 2021-05-14
  • 打赏
  • 举报
回复
引用 1 楼 得一以生的回复:
父类A,属性a1,方法a2,这个是在A.java中定义的。 子类B继承A,属性b1,方法b2,从A继承得到a1,a2 然后你用A a = new B(); 这行代码可以分为两步 1、A a; 定义了一个引用a,是类A的引用,所以a所拥有的只有a1和a2,这个时候还没有指向内存中的某个对象 2、a = new B();将类B的一个对象new B()指向引用a,这个时候有一个默认的向上转型,但是由于b1和b2是定义在B.java里的,与a无关,属于B自己拥有的,只有B的引用才可以使用,A的引用无权使用。 这个是在代码编译期就已经确定的,所以编译无法通过。
谢谢,明白咯,就因为有个默认的向上转型;才导致最后调取的是父类A里面的属性和方法(子类重写的方法)

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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