0

我有以下代码片段尝试使用thissuper.

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();
    }
}

test()在这个最简单的 Java 代码中,将输出重定向到类中方法内的控制台的语句SubClass显示以下输出。

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

this因此,看起来和之间没有区别super,当它们用于访问在其子类中未覆盖的方法时,以及在变量的情况下,当它们在其子类中未隐藏时。

他们都倾向于指向超类成员。但是,如果不是这种情况,则存在明显的差异。

当方法没有被覆盖或者变量没有在各自的子类中被隐藏时,它们是否相同?

4

2 回答 2

2

this因此,看起来和之间没有区别super,当它们用于访问在其子类中未覆盖的方法时,以及在变量的情况下,当它们在其子类中未隐藏时。

它们是有区别的。如果您覆盖第三类中的方法,并test从中调用,您会看到,它super仍然调用SuperClass. 并将this调用新的实现(覆盖)。

添加:

this.method()用法意味着该方法属于对象的实例。因此将使用最后一个实现(私有方法除外)。

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

于 2013-04-21T01:24:28.130 回答
1

是的,它们是一样的。notOverridden方法和非阴影变量由子类继承。

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

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

在此处输入图像描述

于 2013-04-21T01:55:04.707 回答