used the studio programacion para never móviles libro edición desarrollo curso assigned aplicaciones java packages access-modifiers protected

java - the - programacion android pdf 2018



¿Por qué mi subclase no puede acceder a una variable protegida de su superclase cuando está en un paquete diferente? (4)

El problema es que está accediendo a otro miembro protegido de la instancia.

Puede aplicar múltiples soluciones; por ejemplo, si es posible, puede declarar en la clase principal estos dos métodos:

protected void copyRelationStructure(Relation r) { this.copyStructure(r.mStructure); } protected void mergeRelationStructure(Relation r) { for (final Header header: r.mStructure) { if (!mStructure.contains(header)) { mStructure.add(header); } } }

Y luego en el código del niño reemplaza:

this.copyStructure(mRelLeft.mStructure); for (final Header header :mRelRight.mStructure) { if (!mStructure.contains(header)) { mStructure.add(header); } }

Con:

this.copyRelationStructure(mRelLeft); this.mergeRelationStructure(mRelRight);

Eso debería funcionar. Ahora, la relación tiene la responsabilidad de proporcionar métodos que permitan operar consigo mismos a sus hijos. Probablemente la razón detrás de esta política es que los niños no deben meterse con las partes internas de los padres a menos que sean parte del mismo paquete de software con el fin de limitar las incompatibilidades.

Tengo una clase abstracta, relation en package database.relation y una subclase de ella, Join , en package database.operations . relation tiene un miembro protegido llamado mStructure .

En Join :

public Join(final Relation relLeft, final Relation relRight) { super(); mRelLeft = relLeft; mRelRight = relRight; mStructure = new LinkedList<Header>(); this.copyStructure(mRelLeft.mStructure); for (final Header header :mRelRight.mStructure) { if (!mStructure.contains(header)) { mStructure.add(header); } } }

En líneas

this.copyStructure(mRelLeft.mStructure);

y

for (final Header header : mRelRight.mStructure) {

Obtuve el siguiente error:

El campo Relation.mStructure no está visible

Si pongo ambas clases en el mismo paquete, esto funciona perfectamente. ¿Alguien puede explicar este problema?


Funciona, pero solo usted los niños intentan acceder a su propia variable, no a la variable de otra instancia (incluso si pertenece al mismo árbol de herencia).

Vea este código de muestra para entenderlo mejor:

//in Parent.java package parentpackage; public class Parent { protected String parentVariable = "whatever";// define protected variable } // in Children.java package childenpackage; import parentpackage.Parent; class Children extends Parent { Children(Parent withParent ){ System.out.println( this.parentVariable );// works well. //System.out.print(withParent.parentVariable);// doesn''t work } }

Si tratamos de compilar usando el withParent.parentVariable , tenemos:

Children.java:8: parentVariable has protected access in parentpackage.Parent System.out.print(withParent.parentVariable);

Es accesible, pero solo a su propia variable.


Si está protected , su instancia de mStructure no puede acceder a mStructure en otras instancias ( relRight , relLeft ) fuera del paquete.

EDITAR:

La tabla here explica esta situación bastante bien. Marqué al culpable en su pregunta con [] s

Access Levels Modifier Class Package Subclass World public Y Y Y Y protected Y [Y] Y N no modifier Y Y N N private Y N N N


Una advertencia poco conocida sobre protected :

6.6.2 Detalles sobre acceso protegido

Se puede acceder a un miembro o constructor protegido de un objeto desde fuera del paquete en el que se lo declara solo por código que es responsable de la implementación de ese objeto.