引用成员变量

引用成员变量 和 类对象做成员变量
转载 https://www.cnblogs.com/czl-sy/p/3794643.html

  1. 引用成员变量 必须在构造函数的初始化列表中进行初始化

  2. 引用成员变量 并不为这个变量新辟空间;类对象做成员变量则是要对其新辟一段空间的。

<think>好的,用户想了解Java中使用this或super引用成员变量的方法,需要示例和区别。首先,我得回忆一下相关的知识点。根据之前的引用,比如引用[1]提到当成员变量和局部变量同名时,用this来明确指向对象属性,比如this.name =name。引用[2]和引用[3]则展示了super在子类中访问父类成员的情况,比如super.name。还有引用[5]中的示例,展示了构造方法中使用this调用其他构造方法。接下来,我需要整理this和super在引用成员变量时的使用场景。首先,this用于当前类的成员变量,特别是当有命名冲突的时候。而super用于父类的成员变量,尤其是当子类覆盖了父类的变量时。需要给出具体的代码示例来说明两者的区别。然后,要注意两者的使用限制。比如,super只能访问直接父类的成员,而this访问当前对象的成员。此外,在静态上下文中两者都不能使用,这点需要提到,避免用户误解。还要考虑用户可能的疑问,比如在多层继承中super的行为,或者是否可以用super.super来访问更高层的父类,但Java不允许这样做,这也需要说明。最后,生成相关问题,帮助用户深入理解。比如,变量遮蔽时的访问方法,或者构造方法中的使用区别。这些问题应该覆盖用户可能想进一步了解的内容。</think>### Java中this与super引用成员变量的方法及区别 #### 一、`this`引用成员变量 1. **作用场景** - 当成员变量与局部变量同名时,使用`this`明确指向当前对象的成员变量 - 在构造方法中调用其他构造方法时使用`this()`(但必须位于构造方法第一行) 2. **示例代码** ```java class Person { private String name; public Person(String name) { this.name = name; // this.name指向成员变量,右侧name是参数 } public void setName(String name) { this.name = name; // 解决命名冲突 } } ``` --- #### 二、`super`引用成员变量 1. **作用场景** - 当子类与父类存在同名成员变量时,使用`super`访问父类成员 - 只能访问直接父类的成员变量(无法跨级访问) 2. **示例代码** ```java class Country { String name = "China"; } class City extends Country { String name = "Shanghai"; void printNames() { System.out.println(name); // 输出子类的"Shanghai" System.out.println(super.name); // 输出父类的"China" } } ``` --- #### 三、核心区别对比 | 特性 | `this` | `super` | |---------------------|---------------------------------|---------------------------------| | 作用对象 | 当前类的成员变量/方法 | 直接父类的成员变量/方法 | | 命名冲突处理 | 强制访问当前类成员 | 强制访问父类成员 | | 构造方法链 | 通过`this()`调用本类其他构造方法 | 通过`super()`调用父类构造方法 | | 静态上下文可用性 | 不可用(依赖对象实例) | 不可用 | | 继承层级限制 | 无限制 | 只能访问直接父类 | --- #### 四、特殊场景说明 1. **多层继承中的成员访问** 若存在多级继承(如`A→B→C`),`C`类中的`super`只能访问`B`的成员,无法直接访问`A`的成员[^2]。 2. **构造方法的优先级规则** - 子类构造方法中若未显式调用`this()`或`super()`,编译器会自动插入`super()` - `this()`和`super()`必须位于构造方法的第一行,因此二者不能共存[^4] 3. **方法覆盖时的变量访问** 即使子类重写了父类方法,通过`super.方法名()`仍可调用父类原始实现[^3]。 --- #### 五、典型错误示例 ```java class Parent { int value = 10; } class Child extends Parent { int value = 20; void printValue() { int value = 30; System.out.println(value); // 30(局部变量) System.out.println(this.value); // 20(当前类成员) System.out.println(super.value); // 10(父类成员) } // 错误!不能在静态方法中使用this/super static void staticMethod() { // System.out.println(this.value); // 编译错误 } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值