JAVA继承,父类中this的指向问题

本文解析了Java中this关键字在父类和子类间的指向特性,包括this指向子类方法及父类属性的具体行为,帮助理解继承与方法覆盖的底层机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结论:

父类中“this” 指向问题

“this.字段”如果出现在父类代码中,指的就是父类属性。
“this.方法”不管出现在父类还是子类代码中,指的都是子类方法。
“this.字段”如果出现在子类代码中,指的就是子类属性。

当this.方法的时候调用的都是子类的重写方法,但是this.属性的情况:子类继承了父类,并定义了父类中的同名属性,但是没有重写父类中调用该属性的方法,此时子类执行这个从父类继承来的方法会显示调用的是父类的属性。

在网上找了不少的资料其中有一个比较精辟:

不管是子类或者父类中的this,这个this只是指代的是new出来的实例,父类中this.方法就指代的是子类中的方法。

但是对于属性来说父类的this.属性就是指代的是父类的属性。为什么?我又查了资料,问题就出在加载的时候了,要知道创建子类实例的时候会先使用父类的构造器所以就先加载了父类中的属性和方法,在加载父类中方法的时候,里面的属性其实都是确定的,就是父类中的属性(因为子类还没加载)所以最后会使用的是父类的属性。如果重写了该方法,那么调用的属性就是子类的了

### Java子类继承父类成员变量的机制 在 Java 的面向对象编程中,子类会自动继承父类中的成员变量和方法。然而,这种继承行为受到访问控制符的影响。以下是关于子类如何继承父类成员变量的具体机制: #### 1. **成员变量的继承** 子类能够继承父类中声明为 `protected` 或者 `public` 的成员变量[^1]。如果父类的成员变量被声明为 `private`,则该变量不会被子类直接继承,尽管如此,在创建子类实例时,父类的私有成员仍然会在内存中存在并初始化其默认值或指定值。 对于没有显式访问修饰符(即默认包级私有)的情况,只有当子类父类位于同一个包内时才能访问这些成员;否则它们对子类而言是不可见的[^2]。 #### 2. **成员变量的隐藏** 当子类定义了一个与其父类相同名称的成员变量时,会发生成员变量的隐藏现象。这意味着子类中的同名成员变量覆盖了来自父类的那个版本。在这种情况下,通过子类对象操作这个共享名字的变量,默认只会引用到子类自己定义的那一份副本。要明确地访问父类中的那个原始成员,则需借助于 `super` 关键字来完成[^5]。 例如: ```java class Parent { public String name = "Parent"; } class Child extends Parent { public String name = "Child"; void displayNames() { System.out.println(super.name); // 输出: Parent System.out.println(this.name); // 输出: Child } } ``` 在此例子中展示了即使两者都有名为 `name` 的属性,但由于上下文的不同而分别指向各自的域。 #### 3. **静态 vs 实例成员变量** 需要注意的是,无论是静态还是非静态(实例),只要满足可访问条件都会被考虑进入继承范围之内。不过有一点区别在于,如果是静态成员的话,即便是在不同类之间也只有一份单独的存在形式,并且总是优先关联至最初声明它的那个类别之上而不是具体的某个派生实体上去查找匹配项[^4]。 总结来说,Java 提供了一套清晰明了却又灵活多变的方式来处理基底类型及其衍生出来的各种特性之间的关系——特别是围绕着数据存储单元方面所做的安排更是体现了这一点的重要性所在!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值