0

と を使用しようとする次のコード スニペットが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

どちらもスーパークラスのメンバーを指す傾向があります。ただし、そうでない場合は、明らかな違いがあります。

メソッドがオーバーライドされていない場合、または変数がそれぞれのサブクラスでシャドウされていない場合、それらは同じですか?

4

2 に答える 2

2

そのため、サブクラスでオーバーライドされていないメソッドにアクセスするために使用される場合と、サブクラスでシャドウされていない変数の場合に、thisとの間に違いはないようです。super

違いがあります。3 番目のクラスのメソッドをオーバーライドし、そこから呼び出すと、の実装がまだ呼び出されtestていることがわかります。そして、新しい実装を呼び出します (オーバーライドされます)。superSuperClassthis

添加:

this.method()使用法は、メソッドがオブジェクトのインスタンスに属していることを意味します。そのため、最後の実装が使用されます (プライベート メソッドを除く)。

super.method()使用法はインスタンスのメソッドを意味しますが、現在のクラス (super、または super.super など) の前に実装されています。

于 2013-04-21T01:24:28.130 に答える
1

はい、同じです。notOverriddenメソッドとシャドウされていない変数は、サブクラスによって継承されます。

これをよりよく理解するには、オブジェクトがメモリ内でどのように配置されているかを知ることが役立ちます。たとえば、下の図。サブクラスのオブジェクトだとします。青色の領域は親から継承したもので、黄色の領域はそれ自体で定義されたものです。このメソッドは、Vtable を使用することを除いて、同様の設計になっています。

子オブジェクトは、新しく追加されたフィールドを配置するためにより多くのスペースが必要であることを除いて、親オブジェクトと同じメモリ レイアウトを持ちます。このレイアウトの利点は、サブクラス オブジェクトを指す親型のポインターが、最初に親オブジェクトを認識できることです。

ここに画像の説明を入力

于 2013-04-21T01:55:04.707 に答える