¿Qué método de instancia cuando se llama método de tipo súper llama al método presente tanto en el tipo de super y subtipo

Colgar:

Perdóneme si me falta algún núcleo de Java aquí.

Yo estaba buscando a través HashSetjavadocs 's para la especificación de ella de implementación de Collection.containsAll()y, al parecer, hereda la aplicación por AbstractCollectionla cual de acuerdo a la documentación de código fuente del JDK 8 dice así:

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

Mi pregunta surge del hecho de que, si bien HashSetno anula containsAll()Sin embargo, sí anular contains():

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

AbstractCollection igualmente:

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;
}

Mi opinión ha sido que cuando una llamada miembro de instancia no se especifica explícitamente dentro de la instancia, la JVM implícitamente lo reemplaza con this.instanceMemberCall()que en este caso se traduciría en AbstractCollection's contains()que se llama. Pero, de nuevo he leído aquí que la complejidad del tiempo de HashMap/ HashSet's containsAll()sería O (n) lo que sugiere que HashSet' s contains()(O (1)) se llama. Apreciaría un poco de claridad en cuanto a lo de la semántica reales detrás de esto son.

GhostCat saludos Monica C.:

No, esto no es más que el polimorfismo. Cada vez que se invoca un método en un objeto, el verdadero tipo de objeto que importa, nada más.

Significado: no importa que foo()se implementa en la base. Cuando foo()las llamadas bar()con bar()ser manipulables en Child. Cuando se tiene un objeto secundario, entonces siempre será el niño bar()versión que es llamada.

En su ejemplo, thisno es AbstractSet, es HashSet!

O, de nuevo, en otras palabras: no importa "donde" se invoca un método. Lo que importa es el tipo de objeto que se invoca en. Y como se ha dicho, el objeto es de tipo HashSet!

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=180511&siteId=1
Recomendado
Clasificación