2017-01-17 2 views
1

Javaでは、1つのオブジェクトは次のように父のメソッドを呼び出すことができます:((Father) this).m1(); その相違点は何ですか:Father f = sonObj; f.m1();Java - 差分((classType)this).m1()と静的参照

public Father extends Object { 
public void m1(){} 
} 

public Son extends Father { 
    public void m1() { 
    ((Father) this).m1(); 
    } 
} 
+1

Iのアドバイスを、あなたは最初にあなたのコードを実行してみてください。両方の 'm1()'にprintステートメントを置くことを忘れないでください。 – Azodious

+1

javaのすべてのクラスが暗黙的に 'Object'クラスを拡張するので、明示的に' Object'クラスを拡張する必要はありません。 –

+2

'((Father)変数).m1()を呼び出すと、Javaのように息子の' m1() 'が常に実行され、すべてのメソッドが仮想になります。この_within_ sonのm1()を実行しようとすると、Son.m1()の無限再帰が発生します – Quota

答えて

1

ジャワ - 違い((するClassType)本).m1()と静的参照

Father f = sonObj; f.m1(); 

詳細それは静的参照が、参照されません。

((Father)this).m1(); 

との違いは何です::お電話の両方のケースで

Father f = sonObj; f.m1(); 

は、Javaのオブジェクトで

は、このような父のメソッドを呼び出すことができますthisによって参照されるインスタンスのm1()メソッドnd sonObj。 あなたの例では、これらはSonのインスタンスです。 したがって、Sonm1()メソッドを呼び出すメソッドです。

あなたがそれを行う必要があります親クラスのm1()メソッドを呼び出すには:

public Son extends Father { 
    public void m1() { 
    super.m1(); 
    } 
} 
+0

((父)これ).m1()とsuper.m1は同じありがとうございます。しかし、私は親メソッドを呼び出す場合、最初の作品はなぜですか?私はそれがまだ息子の物だと思う。 – thomas

+1

'((Father)this).m1()'と 'super.m1()'は同じものではありません。 '((Father)this).m1()'は 'this'によって参照されるインスタンスの' m1() 'メソッドを呼び出します。 'this'が' Son'インスタンスを参照する場合、 'Son'の' m1() 'が呼び出されます。 'super.m1()'は子クラスが 'm1()'親メソッドを呼び出すために使用できる能力です。 – davidxxx

+0

ahh ok。ありがとう。 – thomas

関連する問題