2012-02-15 12 views
3

は私がスーパークラスを持っている:Javaのオーバーライドメソッド呼び出し

public class SuperClass { 

    public void dosomething() { 
     firstMethod(); 
     secondMethod(); 
    } 

    public void firstMethod() { 
     System.out.println("Super first method"); 
    } 

    public void secondMethod() { 
     System.out.println("Super second method"); 
    } 
} 

サブクラス:

public class SubClass extends SuperClass { 

    public void dosomething() { 
     super.dosomething(); 
    } 

    public void firstMethod() { 
     System.out.println("Sub first method"); 
    } 

    public void secondMethod() { 
     System.out.println("Sub second method"); 
    } 
} 

テストクラス:

public static void main(String[] args) { 
     SubClass sub = new SubClass(); 
     sub.dosomething(); 
     SuperClass sup = new SuperClass(); 
     sup.dosomething() 
} 

私はテストメソッドを実行

、I得られた:

Sub first method 
Sub second method 

これがどう起こったか教えていただけますか?サブクラスdosomethingのメソッドではsuper.dosomething()を呼び出しました。スーパーメソッドが呼び出されると思いますが、サブクラスのオーバーライドメソッドが呼び出されました。

私はこれを行う場合:
SuperClass superClass = new SuperClass();
superClass.dosomething();


を結果は次のとおりです。
スーパー最初の方法
スーパー第二の方法

違いは、メソッド呼び出しの場所です。このような

...

おっとスーパーリファレンスが最初の例でサブクラス化する指さ::!私は私が知っている `tを何か)がなければならないと思います

SuperClass sub = new SubClass();
sub.firstMethod();
sub.secondMethod();

答えて

1

メソッドが呼び出されるオブジェクトのタイプは、SuperClassではなく、SubClassです。 SuperClassで定義されているメソッドだけを呼び出しても、実行コンテキストはSubClassのままです。したがって、呼び出されたメソッドはオーバーライドされ、実際はオーバーライドされたメソッドが実行されます。

firstMethodとsecondMethodをpublicと宣言することで、SuperClassは実際にはサブクラスの動作を無効にすることができます。これが適切でない場合、メソッドはプライベートであるか、最終的でなければなりません。

+0

この機能は非常に便利だと思いますが、それはどのように詳細に動作するのか分かりません:( – Felix

+2

@Felix:あなたはそれについて理解していますか?変数が定義された型ではなく、重要なオブジェクトの実行時の型です。 –

3

でjavaの場合、bindingのメソッドは常にdynamic [静的メソッドとプライベートメソッドは無視されます]です。したがって、firstMethod()secondMethod()をオーバーライドすると、タイプ​​のオブジェクトは、そのいずれかを呼び出そうとします。つまり、[invokation]が親メソッドからのものであっても、オーバーライドされたメソッドが呼び出されます。

したがって、super.doSomething()を呼び出すと、firstMethod()secondMethod()が呼び出され、オーバーライドされたメソッドが呼び出されています。

+0

"(静的メソッドとプライベートメソッドを無視する)" –

+0

@JoachimSauer:答えにプライベート例外を追加しました。ありがとう。 – amit

1

Super.dosomething()実際にはクラスのdosomething()メソッドを呼び出します。しかし、この方法の中では、という関数は、firstMethodsecondMethodです。これらのメソッドは、Subクラスで上書きされ、Subクラスから呼び出されています。

としてペタル・イワノフが示唆:

をあなたがそれらを最終

+0

Superクラスのメソッドを呼び出す方法...基本クラスのdoSomeThing()内のfirstMethod()の代わりに 'this.firstMethod()'が動作しますか? – aProgrammer

+1

私の編集をチェック!! –

+0

@aProgrammerそれはまだ同じです。 – Felix

1

をマークする場合は確かにスーパーのdoSomethingが呼び出されるオーバーライドされてからそれらを防ぐことができます。何かが仮想メソッドであるfirstMethodとsecondMethodを呼び出していますか(Javaのメソッドはデフォルトでは仮想であり、オーバーライド可能です)。したがって、オーバーライドされたバージョンが呼び出されます。

最終的にマークすると、それらが上書きされるのを防ぐことができます。

関連する問題