Java父类方法中this引用表现差异的原因咨询
这问题的核心其实要区分this的本质和Java中成员变量与对象引用的绑定规则差异,咱们掰开揉碎了说:
首先明确:两个方法里的this指向完全一致
不管是父类的getX()还是getObject(),里面的this永远指向你实际创建的那个SubClass实例——也就是sub对象。Java里的this是运行时绑定的,它代表的是当前执行方法的那个对象实例,和方法属于父类还是子类无关。所以这俩方法里的this没有任何区别,都是同一个子类对象。为什么getX()返回9?是成员变量的编译期绑定导致的
getX()是父类SuperClass的方法,在编译这个方法的时候,编译器看到this.x,只会在SuperClass的作用域里找x的定义——也就是父类那个protected int x。虽然子类SubClass也定义了同名的x,但这属于变量隐藏,子类的x是一个全新的独立变量,和父类的x没有关系。父类方法里的x在编译阶段就已经绑定到父类的变量上了,运行时不管this实际指向子类还是父类实例,这个方法都会取父类的x值。为什么getObject()返回SubClass实例?因为this就是实际对象本身
getObject()返回的是this引用本身,而this在运行时就是你创建的SubClass实例。虽然这个方法属于父类,但它只是把当前对象的引用返回出去——这个引用的实际类型就是运行时的对象类型(SubClass),所以返回的自然是子类实例。这里不存在变量绑定的问题,直接返回的是对象本身的引用。
总结一下:你觉得“this表现不同”是个错觉,本质是成员变量是编译期绑定,而对象引用是运行时绑定——两个方法里的this都是同一个子类对象,只是getX()取的是编译时就确定好的父类变量,而getObject()直接返回了this这个实际对象的引用。
内容的提问来源于stack exchange,提问作者stef9998

