2
abstract class A {

    public void methodA() {
        System.out.println("methodA");
        methodB();
        showName();
    }

    public abstract void methodB();

    public void showName() {
        System.out.println("in showname base");
    }
}

class B extends A {

    public void methodB() {
        System.out.println("methodB");
    }

    public void showName() {
        System.out.println("in showname child");
    }
}

public class SampleClass {

    public static void main(String[] args) {
        A a = new B();
        a.methodA();
    }
}

出力は:

子のshownameの
methodAmethodB

質問 :-

オーバーライドするので、オブジェクトタイプが考慮されます。クラスAではなくクラスBのshowName()メソッドが呼び出された理由は何ですか?そうでない場合、この出力順序の原因は何ですか?

4

5 に答える 5

4

タイプBのオブジェクトを作成したため、そのオブジェクトで呼び出されるすべてのメソッドはクラスBになります。クラスBが一部のメソッド(methodAなど)を実装していない場合、Javaは親クラス(A)でメソッドを見つけようとします。オブジェクト指向言語のポリモーフィズムについて読む必要があります。

http://en.wikipedia.org/wiki/Polymorphism_in_object-Oriented_programming

于 2012-08-06T18:55:33.810 に答える
3

それは簡単です:

    A a = new B();
    a.methodA();

ここで、aはクラスのオブジェクトであることがわかっているため、オーバーライドがないB場合、クラスでオーバーライドできるすべてのメソッドがクラスBから使用され、クラスBのメソッドをA使用する必要があります。

順序を検討する:

methodA次のように宣言されているものを呼び出します。

public void methodA() {
    System.out.println("methodA");
    methodB();
    showName();
}

あなたの内側からとの両方をmethodA()呼び出します。それらはクラスでオーバーライドされ、オブジェクトaはであるため、(Bクラスからの)それらが使用されます。methodB()showName()Binstanceof B

コメントで述べたように編集:

@Jaikrat Singh、クラスBはまだクラスAです(その子ですが、継承はタイプの関係です:IS-A)。クラスBはクラスからメソッドを継承していますA。だからそれmethodAもあります。つまり、これmethodAもクラスから呼び出されBますが、デフォルトのコードがあります-クラスで提供されるものと同じですA

于 2012-08-06T18:54:59.720 に答える
2

を呼び出すとa.methodA()、オブジェクトタイプがであるため、で最初にB検索されます。にはそのようなメソッドがないため、スーパークラスである。でこのメソッドを検索します。クラスで検索すると、実行が開始されます。methodABBAmethodAA

実行すると、印刷され、クラスに実装されてmethodAいる次に呼び出されるメソッド()の検索が開始され、次に印刷されます。methodBBmethodB

次に呼び出されるメソッドはshowName、です。これは両方のクラスに実装されています。Javaはオブジェクト型と同じクラスの実装を探し始めるので、最初の試行でクラスを見つけますB

主なルールは単純です。Javaは最初にオブジェクトnew型クラス(演算子の後に続く名前)でメソッドを見つけようとします。メソッドがそこに実装されていない場合、スーパークラスを通過し始めます。

于 2012-08-06T19:00:07.350 に答える
2

オブジェクト'a'はタイプAとして宣言されますが、タイプBとしてインスタンス化されます。ポリモーフィズムにより、宣言タイプのメソッドではなくインスタンスタイプのメソッドが呼び出されます。したがって、内部的にタイプBであるため、showName( )クラスBのメソッドが呼び出されます。

于 2012-08-06T18:55:11.690 に答える
0

抽象クラスAがあり、それは。によって拡張されBます。Extendsは。と同等B "is a" Aです。たとえば、リンゴが果物を伸ばした場合、apple 'is a' fruit。それは果物のように機能しますが、バナナができないリンゴのこともします。したがってB、と同じように動作しAますが、他のことも実行できます。したがって、あなたの例では、B2つのメソッドを上書きします。Bこれらは、デフォルトですべてのオブジェクトによって呼び出されます。AからのメソッドにアクセスBするには、キーワードを使用する必要がありますsuper

オブジェクトが最初に(親から上書きされたとしても)それ自体でメソッドを見つけ、次に継承ツリーを登ってそうでないメソッドを見つけることは、ポリモーフィズム(Javaプログラミングの重要なポイント)の一部です。そのクラスで直接。

あなたの例のために:

public void methodA() {
    System.out.println("methodA"); //This prints no problem.
    methodB(); //This searches the "B" class for a method called "methodB"  If it can't find it, it checks its parent for a "methodB"
    showName();//This searches the "B" class for a method called "showName"  If it can't find it, it checks its parent for a "showName"
}

上記のコードが呼び出されます。あなたはこれをよく知っています(あなたが行った他のコメントから、私はこれを仮定しています)。行methodB()が呼び出されると、タイプのオブジェクトはBBファイル全体でメソッドをチェックします。Aメソッドが存在しない場合にのみ、そのメソッドにジャンプします。次に、についても同じことを行いshowName()ます。

于 2012-08-06T18:56:09.737 に答える