【发布时间】:2020-03-26 19:41:37
【问题描述】:
我有一个类 A,它扩展了一个抽象类 B。
让B有一个受保护的字段value
我想在A中使用这个字段。如果A没有值,我可以写this.value从B那里得到它。
和super.value有什么区别吗?
【问题讨论】:
-
请显示代码以配合您的描述。
标签: java inheritance this super
我有一个类 A,它扩展了一个抽象类 B。
让B有一个受保护的字段value
我想在A中使用这个字段。如果A没有值,我可以写this.value从B那里得到它。
和super.value有什么区别吗?
【问题讨论】:
标签: java inheritance this super
这取决于...
如果只有类B 声明了一个字段value,那么就没有关系了。但是如果A 类也声明了一个字段value,那么这很重要:
看看这个例子:
public class A extends B {
private Object value = "A";
public void printValue() {
System.out.println(super.value);
System.out.println(this.value);
}
public static void main(String[] args) {
A a = new A();
a.printValue();
}
}
如果你运行这段代码,输出是:
B
A
JLS says
super.Identifier 形式指的是名为 Identifier 的字段 当前对象,但将当前对象视为 当前类的超类
因此,由于超类B 声明了一个字段value,它被super.value 引用。
关于关键字this JLS says:
...关键字
this表示一个值,它是对 调用实例方法或默认方法的对象...this的类型是类或接口类型T,其中关键字this发生。
在您的情况下,this 的类型是 A。因此this.value 引用在类B 中声明的继承字段value。但是如果A 类会声明一个字段value,那么this.value 将引用A 类中的字段。
【讨论】: