【问题标题】:Using this and super in Java在 Java 中使用 this 和 super
【发布时间】: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


【解决方案1】:

所以,this 和 super 之间似乎没有区别, 当它们用于访问未被覆盖的方法时 它的子类,如果是变量,当它们不是 隐藏在其子类中。

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

加法:

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

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

【讨论】:

  • 另外,你不能在同一个构造函数中调用this()和super()。
  • super 是相对的,所以它会调用SubClass 中的重写方法。 this 也会,除非它们在 SubSubClass 中被覆盖。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2011-04-30
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多