gpt4 book ai didi

java - 下面的命令中 super 和 this 之间的区别?

转载 作者:行者123 更新时间:2023-11-30 02:36:37 25 4
gpt4 key购买 nike

当我有一个类 A 和一个类 B(其中 B 扩展 A )并且它们有一个公共(public)实例变量 size 并且从方法调用以下命令时,这些命令之间有什么区别 < B 内的strong>printSize1?

class A {
protected int size;
}

class B extends A {
protected int size=7;

public void printSize1() {
System.out.println(((A)this).size)
System.out.println(super.size);
}
}

我也和这两个人有同样的问题。我有一个类 A 和一个类 B,其中 B 扩展了 A,它们都有一个具有相同名称 printSize 的方法和一个实例变量 size ,并且调用以下命令来自类 B 内的方法 printSize2

class A {
protected int size;

public void printSize() {
System.out.println("Size=" + size);
}
}

class B extends A {
protected int size=7;

public void printSize2 {
((A) this).printSize();
super.printSize();
}

public void printSize() {
System.out.println ("MSize="+size);
}
}

最佳答案

i have a class A and a Class B where B extends A which they have a common instance variable size

不,他们没有。它们有单独名为 size 的实例变量。 。一个位于与 A 关联的对象部分,另一个位于与 B 关联的对象部分。我们称它们为 A$size。和B$size 。为了让它们有一个公共(public)实例变量,您需要删除 size 的声明来自B所以他们都使用 A$size .

重新声明祖先的非 private实例变量(字段)始终是一个坏主意,因为它会导致这种困惑。

以下两个输出 0对于您的示例代码,因为它们都访问 A$size ,您从未为其赋值,因此它具有默认值 0 :

System.out.println(((A)this).size);  // 0
System.out.println(super.size); // 0

所以问题是:为什么他们都使用 A$size而不是B$size ?由于我们用来查找 size 的引用的类型 。在这两种情况下,引用的类型都是 A ,因为 (A)this 的类型是 A (通过强制转换)和 super 的类型在B中的方法中也是A 。由于引用的类型是 A ,是Asize被使用。

在这种特定情况下,两者之间没有太大区别,但如果您向层次结构添加另一层,就会有区别:

class A {
protected int size = 1;
}
class B extends A {
protected int size = 2;
}
class C extends B {
protected int size = 3;

void printSize() {
System.out.println(((A)this).size); // 1
System.out.println(super.size); // 2
System.out.println(this.size); // 3
}
}

这个故事的寓意:不要重新声明祖先声明的实例变量(除非祖先的版本是 private )。

请注意,变量与方法的情况不同。实例方法是多态的。实例变量则不然。通过方法,您可以获得与对象的最终类型关联的方法(除非您使用 super 或限定的 super ,因为它们很特殊并且绕过多态性)。

这就是 printSize2 中的第二个示例中发挥作用的内容。 。由于方法是多态的,因此您是否强制转换 this 并不重要。输入 A((A)this).printSize() ,你仍然得到 BprintSize 。但是super.printSize()很特别,因为super是特殊的并且绕过多态性,给出 B访问AprintSize .

关于java - 下面的命令中 super 和 this 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42876391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com