我有以下代码段,尝试使用this
和super
。
class SuperClass
{
public final int x=10;
public final String s="super";
public String notOverridden()
{
return "Inside super";
}
public String overrriden()
{
return "Inside super";
}
}
final class SubClass extends SuperClass
{
private final int y=15;
private final String s="sub"; //Shadowed member.
@Override
public String overrriden()
{
return "Inside sub";
}
public void test()
{
System.out.println(super.notOverridden());
System.out.println(this.notOverridden());
System.out.println(this.overrriden());
System.out.println(super.overrriden());
System.out.println(this.s);
System.out.println(super.s);
System.out.println(this.x);
System.out.println(super.x);
System.out.println(this.y);
}
}
public final class Test
{
public static void main(String[] args)
{
SubClass subClass=new SubClass();
subClass.test();
}
}
在这个最简单的Java代码中,将输出重定向到类test()
中方法SubClass
内的控制台的语句显示以下输出。
Inside super
Inside super
Inside sub
Inside super
sub
super
10
10
15
因此,似乎this
和super
之间没有区别,当它们用于访问在子类中未被覆盖的方法时以及在变量的情况下,当它们被覆盖时不在其子类中被遮蔽。
他们都倾向于指向超级成员。但是,如果不是这种情况,则存在明显的差异。
它们是否相同,何时不覆盖方法或不在相应的子类中隐藏变量?
答案 0 :(得分:2)
因此,似乎
this
和super
之间没有区别, 当它们用于访问未被覆盖的方法时 它的子类(如果是变量,则不是。) 在其子类中被遮蔽。
有区别。如果您覆盖第三类中的方法,并从中调用test
,您会看到super
仍然调用SuperClass
的实现。 this
将调用新的实现(覆盖)。
增加:
this.method()
用法意味着该方法属于该对象的实例。因此将使用最后一个实现(私有方法除外)。
super.method()
用法表示实例的方法,但在当前类(super或super.super等)之前实现。
答案 1 :(得分:1)
是的,它们是一样的。子类继承notOverridden
方法而不是阴影变量。
为了更好地理解这一点,了解对象在内存中的位置是有帮助的。例如,在下图中。假设它是子类的对象。蓝色区域是它从父级继承的,黄色区域是由它自己定义的。除了使用Vtable之外,该方法具有类似的设计。
子对象具有与父对象相同的内存布局,除了它需要更多空间来放置新添加的字段。这种布局的好处是指向子类对象的父类型的指针仍然在开头看到父对象。