【发布时间】:2013-04-21 01:15:08
【问题描述】:
我有以下代码 sn-p 尝试使用 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 代码中,在 SubClass 类中的方法 test() 内将输出重定向到控制台的语句会显示以下输出。
Inside super
Inside super
Inside sub
Inside super
sub
super
10
10
15
因此,this 和 super 之间似乎没有区别,当它们用于访问在其子类中未被覆盖的方法时,以及在变量的情况下,当它们未被遮蔽时它的子类。
它们都倾向于指向超类成员。但是,如果不是这种情况,则存在明显的差异。
当方法没有被覆盖或者变量没有在各自的子类中被隐藏时,它们是否相同?
【问题讨论】:
-
听起来你已经回答了你的问题,但是是的。
-
是的,但我认为这是危险的假设。您最终可能会覆盖子类中的方法,然后是 super,这不会给出相同的结果。
-
"在其子类中未被覆盖的方法" 一个类不应该知道关于它的子类的任何事情。您不能确定某些子类不会覆盖该方法,除非它是
final。
标签: java inheritance this super