[英]Difference between super(variableName) ; and super.variableName
[英]Difference between super and this in the commands below?
当我拥有A类和B扩展了A的B类并且它们具有公共实例变量大小并且下面的命令从B内部的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);
}
}
我有一个A类和一个B类,其中B扩展了A,它们具有相同的实例变量大小
不,他们没有。 它们具有称为size
单独的实例变量。 一个位于与A关联的对象的一部分中,另一个位于与B关联的对象的一部分中。我们将它们称为A$size
和B$size
。 为了使它们具有公共实例变量,您可以从B
删除size
的声明,以便它们都使用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
(通过强制转换),并且B
中方法的super
的类型也是A
由于引用的类型为A
,因此将使用A
的size
。
在这种特殊情况下,两者之间没有太大的区别,但是如果您向层次结构中添加了另一层,那就会有很大的区别:
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
或qualified super
,因为它们是特殊的并且绕过了多态性)。
这就是您在printSize2
的第二个示例中所printSize2
。 因为方法是多态的,没关系,你已经投this
将是类型A
中((A)this).printSize()
你仍然可以得到B
的printSize
。 但是super.printSize()
是特殊的,因为super
是特殊的并且绕过了多态性,从而使B
可以访问A
的printSize
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.