2013-04-21 94 views
0

我尝试使用thissuper以下代码段。在Java中使用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()内的输出到控制台的语句。

Inside super 
Inside super 
Inside sub 
Inside super 
sub 
super 
10 
10 
15 

因此,看来有thissuper之间没有差别,当它们被用于未在它的子类(ES)重写访问方法和在变量情况下,当它们没有在阴影其子类(es)。

他们都倾向于指向超类成员。然而,如果不是这种情况,则会有明显的区别。

它们是否相同,当方法没有被覆盖或者变量没有被映射到相应的子类中?

+1

这听起来像你已经回答了你的问题,但是有。 – supersam654 2013-04-21 01:17:34

+1

是的,但我认为这是危险的假设。你最终可能会覆盖子类中的方法,然后超级,这不会给出相同的结果。 – Matt 2013-04-21 01:20:12

+0

“在其子类中未被覆盖的方法”一个类不应该知道其子类的任何内容。你不能确定该行的一些子类不会覆盖该方法,除非它是“final”。 – newacct 2013-04-21 20:18:51

回答

2

因此,它似乎有当它们用于未在 它的子类(ES)和变量的情况下,覆盖的接入方式thissuper, 之间没有区别,当他们不 在其子类中有影子。

有差别。如果您覆盖第三类中的方法,并从中调用test,您将会看到,super仍然调用SuperClass的实现。并且this将调用新的实现(重写)。

增加:

使用意味着方法属于该对象的实例。所以最后的实现将被使用(除了私有方法)。

super.method()用法暗示实例的方法,但在当前类(super或super.super等)之前实现。

+0

另外,你不能在同一个构造函数中调用this()和super()。 – 2013-04-21 01:27:56

+0

'super'是相对的,所以它会调用'SubClass'中的重写方法。 'this'也会,除非它们在SubSubClass中被覆盖。 – ddmps 2013-04-21 01:28:05

1

是的,它们是相同的。 notOverridden方法而不是被子类继承的影子变量。

为了更好地理解这一点,了解对象在内存中的位置很有帮助。例如在下图中。假设它是一个子类的对象。蓝色区域是它从父项继承的区域,黄色区域是它自己定义的内容。除了使用Vtable之外,该方法具有类似的设计。

子对象具有与父对象相同的内存布局,除了它需要更多空间来放置新添加的字段。这种布局的好处是,指向子类对象的父类型指针在开始处仍然会看到父对象。

enter image description here

相关问题