スーパータイプのメソッドがスーパータイプとサブタイプの両方でメソッドの存在を呼び出したときに、どのインスタンスメソッドが呼び出されます

HANG:

私はここにいくつかのコアのJavaを欠けている場合はすみません。

私は、を検索してHashSetのそれの実装の仕様のためのjavadocをCollection.containsAll()し、それは明らかで実装を継承AbstractCollectionに応じたJDK 8ソースコードのドキュメントは、このように書きます:

public boolean containsAll(Collection<?> c) {
    for (Object e : c)
        if (!contains(e))
            return false;
    return true;
}

私の質問は、しばらくはという事実に由来HashSet上書きされることはありませんcontainsAll()がオーバーライドしないことをcontains()

public boolean contains(Object o) {
    return map.containsKey(o);
}

AbstractCollection 同様に:

public boolean contains(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
        while (it.hasNext())
            if (it.next()==null)
                return true;
    } else {
        while (it.hasNext())
            if (o.equals(it.next()))
                return true;
    }
    return false;
}

私の理解では、インスタンスメンバの呼び出しを明示的にインスタンス内に指定されていない場合、JVMは、暗黙のうちに置き換えられていることとなっているthis.instanceMemberCall()。この場合には変換することになるAbstractCollectionのがcontains()呼び出されています。しかし、その後、再び、私はここで読むための時間の複雑さということHashMap/ HashSetさんは、containsAll()ことを示唆しているO(n)となりますHashSetS ' contains()(O(1))と呼ばれています。この背後にある実際の意味が何であるかに関して、いくつかの明確さをお願い申し上げます。

GhostCat敬礼モニカC.:

いいえ、これは単純に多型です。メソッドがオブジェクトで呼び出されるたびに、真のそのオブジェクトの種類は、他に何も問題にしません。

意味:問題ではありませんfoo()ベースで実装されています。ときfoo()のコールbar()bar()子で上書きされています。あなたは子オブジェクトを持っている場合、それは常に子供になりbar()呼び出されるバージョン。

あなたの例では、thisAbstractSetないが、それはですHashSet

それとも、再び他の言葉で:それは、メソッドが呼び出され、「どこ」問題ではありません。重要なのは、それが呼び出されたオブジェクトのタイプです。言ったように、あなたのオブジェクトの型はHashSetのです!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=180508&siteId=1
おすすめ