重写方法在没有多态的情况下,new的是哪个对象,就是调用的哪个类的方法,但是对于子父类同名成员变量却不是
这是对我之前一篇博文的补充:关于子类和父类中的this的用法 - 明月镇魂 - 博客园
之前博文里面都是有多态的情况,但是请看以下代码:
public class Demo02 { public static void main(String[] args) { Zi zi =new Zi(); zi.show(); } } class Fu { public String num = "父类成员变量"; public void show() { System.out.println(this.num); System.out.println(this.fun1()); //System.out.println("父类方法"); } public String fun1() { System.out.println(this.num); return "父类调用"; } } class Zi extends Fu { public String num = "子类成员变量"; public String fun1() { System.out.println(this.num); return "子类调用"; } }
这里面是子类变量引用子类对象,没有多态,最终的输出结果是:
父类成员变量
子类成员变量
子类调用
现在zi调用show,然后调用里面的fun1方法,这种时候这里面的this谁来调用我,我就代表谁,其实就是根据创建的对象来决定调用的是哪个类的方法;
但是成员变量可不能这么解释,在Java中,“成员变量的访问是基于声明类型的”这句话意味着当你在一个类的方法内部访问某个成员变量时,Java会根据这个方法所在的类(即成员变量被声明的那个类)来决定访问哪一个成员变量,而不是根据对象的实际运行时类型。这与方法调用不同,方法调用可以根据实际对象的类型(多态性)来决定调用哪个版本的方法。
所以在java中,方法调用是动态绑定的(在这个例子中,尽管show()
方法本身没有被重写,但我们谈论的是如果它被重写时会发生什么),但成员变量的访问通常是静态解析的(基于编译时的类型信息)。在这个特定情况下,由于show()
方法是在父类中定义的,并且没有使用任何多态性来间接访问变量(比如通过父类的引用指向子类对象并调用一个可能被子类重写的方法),所以成员变量的访问是静态的,基于方法定义的位置。通俗解释:在Java中,方法内部的成员变量访问通常是基于编译时类型的(这称为“字段隐藏”的副作用),而不是运行时类型,有一个例外:如果通过方法调用(如this.someMethod()
)间接访问成员变量,并且该方法被子类覆盖,那么实际上调用的是子类的方法,而子类方法内部访问的成员变量将基于子类的类型(这又是多态性的表现)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理