关于Java多态引用和this的问题,希望大家能帮我解答一下,困扰好久了

public class Test {
public static void main(String[] args) {
A a = new B();
a.show();

}
}

class A {
int x = 50;

public void show() {
System.out.println(this.x);
}


}

class B extends A {
int y = 100;

@Override
public void show() {
this.y = 200;
this.showB();
System.out.println(this.y);
}

public void showB() {
System.out.println("我是子类的showB方法");
}
}

输出的结果就是
我是子类的showB方法
200

问题来了,a.show()此时a调用的是在子类中重写过的show方法。dan在类B里的show方法中,this表示调用此方法的对象,那么此时this是a,可是a此时是A类声明但指向B类,也就是转型,应该只保留父类A里的方法和属性才对,为什么此时还是输出子类B中独有的属性y和方法showB呢。
...全文
497 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
见青山 2018-04-09
  • 打赏
  • 举报
回复
引用变量分为编译时类型和运行时类型, A a = new B();说明变量a的编译时类型为A,运行时类型为B,调用方法时会优先调用运行时类型B中的方法,如果B中没有重写此方法,则调用A中对应的方法。也就是说,同样类型(编译时类型)调用同样的方法,可能呈现不同的结果,这就是多态。例如,A a = new B(); a.show();和A a = new A(); a.show();中,同样的a.show();会调用不同的方法。
qq_41737565 2018-04-09
  • 打赏
  • 举报
回复
引用 3 楼 m0_37652657 的回复:
[quote=引用 2 楼 qq_41737565 的回复:] 楼主的理解有误,多态中A父类引用指向B子类对象后,A引用是只能调用本身声明的方法,并不代表A引用指向的B对象中没有其他方法,不是楼主所理解的只保留A引用的方法和属性。类比,一只狗在你 面前,你只知道它是一只动物,也只会调用它身为动物该有的方法和属性,但这只狗就真的不会“汪汪汪”?
原来是这样,那我是理解错了,也就是说此时B里面的属性和方法都还在并不是丢失了,只是a只能用它们共同的方法show,这里a.show()里面的调用showB()方法,本来a是不能直接调用的,但是通过show方法,让show方法去调用到showB的方法从而达到a可以调用showB,我这样理解对吗[/quote] 对。就这个意思。
Defonds 2018-04-09
  • 打赏
  • 举报
回复
你用了 this,肯定用 B 自己的。想用 A 的用 super 指针
oyljerry 2018-04-08
  • 打赏
  • 举报
回复
多态就是a调用方法的时候要看它真实的类型对应的函数。
Ai_SH 2018-04-08
  • 打赏
  • 举报
回复
我是个菜鸟. 我只知道this不就是代表当前对象吗?谁指向它无所谓啊, this.show不就是调用当前这个对象里首先显现出来的show方法吗
引用 2 楼 qq_41737565 的回复:
楼主的理解有误,多态中A父类引用指向B子类对象后,A引用是只能调用本身声明的方法,并不代表A引用指向的B对象中没有其他方法,不是楼主所理解的只保留A引用的方法和属性。类比,一只狗在你 面前,你只知道它是一只动物,也只会调用它身为动物该有的方法和属性,但这只狗就真的不会“汪汪汪”?
原来是这样,那我是理解错了,也就是说此时B里面的属性和方法都还在并不是丢失了,只是a只能用它们共同的方法show,这里a.show()里面的调用showB()方法,本来a是不能直接调用的,但是通过show方法,让show方法去调用到showB的方法从而达到a可以调用showB,我这样理解对吗
qq_41737565 2018-04-08
  • 打赏
  • 举报
回复
楼主的理解有误,多态中A父类引用指向B子类对象后,A引用是只能调用本身声明的方法,并不代表A引用指向的B对象中没有其他方法,不是楼主所理解的只保留A引用的方法和属性。类比,一只狗在你 面前,你只知道它是一只动物,也只会调用它身为动物该有的方法和属性,但这只狗就真的不会“汪汪汪”?
考拉一枚 2018-04-08
  • 打赏
  • 举报
回复
A a = new B(); 这时在堆上分配的对象本质上是B类的对象,只不过现在是通过它的父类A类的句柄去持有它,所以调用a.show时依据多态(通过动态绑定实现)会调用B类对象的show方法
内容概要:本文系统梳理了计算机组成原理的完整知识体系,重点围绕冯·诺依曼体系结构、五大核心硬件(运算器、控制器、存储器、输入/输出设备)、数据表示与运算、存储层级、CPU架构、总线系统及I/O控制机制展开,深入剖析了硬件底层如何支撑Java程序的运行,特别是与JVM内存模型、多线程并发、IO操作、性能调优等关键技术的紧密关联。文章强调通过理解二进制编码、补码运算、缓存机制、指令流水线、乱序执行、中断与DMA等底层原理,Java开发者从根本上解释浮点精度丢失、数值溢出、线程安全、伪共享、IO阻塞等常见问题,并提供性能优化的硬件级视角。; 适合人群:具备一定Java开发基础,工作1-3年,希望深入理解JVM、并发编程、IO模型底层原理的后端研发人员。; 使用场景及目标:① 理解Java代码从编译到执行的完整软硬件链路;② 掌握JVM内存布局、GC机制、线程上下文切换、volatile与synchronized的硬件实现原理;③ 分析并解决高并发、高性能场景下的性能瓶颈,如缓存命中率低、伪共享、总线争用、IO阻塞等问题;④ 在面试中清晰阐述Java底层与计算机硬件的关联,展现扎实的系统功底。; 阅读建议:建议按照文档提供的“八、学习顺序”分阶段学习,每学完一个硬件模块,立即结合对应的Java技术点(如学到Cache时思考伪共享和@Contended)进行复盘,将抽象硬件原理具象化到日常开发场景中,以达到学以致用的目的。
源码链接: https://pan.quark.cn/s/044c82337b8e Teamcenter 12的中文版助文档中,1-1基础模块入门部分,详细介绍了产品设计、产品文档、产品结构、业务流程、客户端与集成接口、AWC、Rich client以及TC的安装与配置等内容,非常适合初学者或者希望了解Teamcenter 12的读者。Teamcenter 12是由Siemens开发的一款功能强大的产品生命周期管理(PLM)软件,它包含了产品设计、产品文档、产品结构、业务流程等多个领域,旨在助企业高效地管理产品开发的全过程。以下是对这些核心知识点的具体阐述: 1-1 Teamcenter简介: Teamcenter作为一个综合性的PLM解决方案,提供了一个集中化的平台来存储、管理和协同所有的产品相关信息。它支持跨部门、跨地域的合作,通过集成CAD系统、业务流程管理工具和数据管理功能,确保了数据的一致性和准确性。 1-1 产品设计: Teamcenter能够管理各种工程设计数据,包括3D模型、图纸、参数化数据等。用户可以方便地查找和组织产品设计数据,进行签出和签入操作以保证版本控制,确保在团队协作中避免数据冲突。 1-2 查找和组织产品设计: 在Teamcenter中,用户可以通过高级搜索功能迅速定位所需的设计文件,同时,系统支持自定义视图和分类,使设计数据的组织更加系统化。 1-3 签出和签入产品设计: 签出和签入机制是Teamcenter中防止数据冲突的重要功能。签出允许用户独占性地编辑某个设计文件,而签入则将更新后的文件版本提交回系统,供其他团队成员查看或编辑。 1-4 产品文档: Teamcenter不仅管理设计数据,还涵盖了产品相关的文档,如规格...

62,622

社区成员

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

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