抽象类中this关键字的工作原理及私有字段访问疑问
问题解答
1. 为什么this能访问Test的私有字段fatherName?
私有字段确实不会被子类继承,但子类对象的内存空间里包含了父类的所有字段(包括私有),只是子类代码本身不能直接访问父类的私有字段。
而setFatherName()是Test类自己定义的方法,在Test类的作用域内,方法可以直接访问当前类的私有成员——不管this指向的是Test本身的实例,还是它的子类实例,只要这个方法属于Test类,就有权限访问Test的私有字段fatherName。
核心逻辑:权限检查看的是方法所在的类,而不是this指向的对象类型。
2. 抽象类中的this关键字如何工作?
this的本质始终是指向当前执行方法的那个对象实例:
- 代码中
new Person()创建的是Person类的实例,虽然用Test类型的变量person来引用,但实际运行时的对象是Person实例。 - 调用
person.setFatherName()时,执行的是Test类中的setFatherName方法,此时方法里的this就指向这个Person实例——所以this.getClass().getSimpleName()会输出Person。 - 但因为
setFatherName是Test类的方法,所以this在这个方法里可以访问Test类的所有成员(包括私有),哪怕this指向的是子类对象。
代码回顾
Test抽象类
abstract class Test { private String fatherName ; public void setFatherName(String fatherName){ System.out.println(this.getClass().getSimpleName()); this.fatherName=fatherName; } public String getFatherName(){ return fatherName; } }
Person子类
public class Person extends Test{ public static void main(String[] args) { Test person = new Person(); // #2 person.setFatherName("Jimmy"); System.out.println("father name is : " +person.getFatherName()); } }
输出
Person father name is : Jimmy
内容的提问来源于stack exchange,提问作者Rishab Negi
相关产品推荐
相关产品推荐

