2010-06-30 23 views
6

Creé una instancia de clase base en clase derivada e intenté acceder a los miembros protegidos.miembros protegidos con Java accedidos en clase derivada utilizando la instancia de clase base

Puedo acceder directamente a miembros protegidos en una clase derivada sin instanciar la clase base.

Clase base:

package com.core; 

public class MyCollection { 

     protected Integer intg; 
} 

Una clase derivada en el mismo paquete -

package com.core; 

public class MyCollection3 extends MyCollection { 

public void test(){ 

    MyCollection mc = new MyCollection(); 
    mc.intg=1; // Works 
} 
}

Una clase derivada en un paquete diferente -

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

public void test(){ 
    MyCollection mc = new MyCollection(); 
    mc.intg = 1; //!!! compile time error - change visibility of "intg" to protected 
} 
} 

¿Cómo es posible el acceso un miembro protegido de una clase base en una clase derivada utilizando instancia de clase base cuando la clase derivada también está en s ¿Qué es un paquete pero no cuando la clase derivada está en un paquete diferente?

Si marco el miembro protegido como "estático", entonces puedo acceder al miembro protegido de la clase base usando una instancia de clase base en una clase derivada que reside en un paquete diferente.

+0

posible duplicado de [Java Protected Access que no trabaja] (http://stackoverflow.com/questions/332920/java-protected-access-not-working) --- ¡En realidad ese es el engaño equivocado! ¡Lo siento! Sin embargo, esto definitivamente es una tontería. – polygenelubricants

+0

no se preocupe, su IDE no hará ninguna diferencia a la pregunta, ya que se trata de la semántica del lenguaje Java en sí. –

+0

posible duplicado de [¿por qué no puedo acceder al método protegido de Java incluso si he extendido la clase?] (Http://stackoverflow.com/questions/1622219/why-cant-i-access-protected-java-method -even-thought-ive-extended-the-class) – starblue

Respuesta

10

Tienes razón en que no puedes hacer esto. La razón por la que no puede acceder al campo es porque no está en el mismo paquete que la clase, , ni tiene acceso a un miembro heredado de la misma clase.

El último punto es la crítica uno - si habías escrito

MyCollection2 mc = new MyCollection2(); 
mc.intg = 1; 

entonces esto funcionaría, ya que se está cambiando un miembro protegido de su propia clase (que está presente en esa clase a través de la herencia). Sin embargo, en su caso está intentando cambiar un miembro protegido de una clase diferente en un paquete diferente. Por lo tanto, no debería sorprender que se te niegue el acceso.

+0

Esta explicación es realmente fácil de entender. Eché un vistazo a la especificación del lenguaje Java y su elaboración pasó por mi cabeza. – Tarun

+0

@Tarun: si la respuesta le ha funcionado, márquela como aceptada (marque debajo del contador de votos) – Bozho

+0

No conozco esta característica. Lo marcaría como respondido ahora. – Tarun

0

De acuerdo con la regla de accesibilidad de miembros de Java, no puede acceder al miembro protegido de una clase sin ampliarlo.

Puede intentar lo siguiente.

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

public void test(){ 
    intg = 1; 
} 
} 

En lugar de crear la nueva instancia, intente asignar el valor. Funcionará.

+0

De acuerdo con su razonamiento – Tarun

3

El Java tutorial dice:

El modificador protegido especifica que el miembro se puede acceder sólo dentro de su propio paquete (como con el paquete-privada) y, además, por una subclase de su clase en otro paquete .

Y en su caso, está accediendo a la variable en otro objeto. Por coincidencia, tiene una clase que es la misma que la actual, pero las comprobaciones de visibilidad no verificaron eso.

Así, la segunda vez que se le niega el acceso, porque estás en un paquete diferente, y la primera vez que le dan acceso porque está en el mismo paquete (y no porque es una subclase)

+0

"primera vez que tiene acceso porque está en el mismo paquete (y no porque sea una subclase)" Esto lo deja en claro. Gracias. – Tarun

1

En En resumen, no es realmente posible. Parece que deberías reconsiderar tu diseño.

Sin embargo, hay una solución alternativa, si está seguro de que eso es lo que quiere hacer. Se puede añadir un protegida método-MyCollection que toma una instancia y establece el valor de intg en su nombre:

package com.core; 

public class MyCollection { 

    protected Integer intg; 

    protected void setIntg(MyCollection collection, Integer newIntg) { 
     collection.intg = newIntg; 
    } 
}

Ahora sus subclases pueden tener acceso a este método:

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

    public void test(){ 
     MyCollection mc = new MyCollection(); 
     setIntg(mc, 1); 
    } 
}

Pero tenga en cuenta que esto es muy extraña forma de hacerlo. Sugeriría de nuevo que tu diseño debe ser reconsiderado antes de seguir esta ruta.

+0

Entiendo tu punto. La manera más fácil para mí habría sido acceder directamente al miembro protegido que crear una instancia de la clase base y acceder a ella en un paquete diferente. Lo hice "por error" mientras jugaba con java (no dije que había sido un probador de manaul :-)) y luego ninguno de mis miembros dev me brindó una respuesta concebible. Así que lo publiqué aquí. – Tarun

0

No se puede acceder a una variable protegida en una clase derivada (que está en un paquete diferente) si se accede utilizando un nuevo objeto de la clase MyCollection. puede escribir intg = 1; directamente sin hacer (nuevo MyCollection) como esto:

package secondary; 
import com.core.MyCollection;  
public class MyCollection2 extends MyCollection{ 

public void test(){ 

    intg = 1; 

} 
} 
3

Si un miembro de la clase es protected entonces hay 2 casos:

  1. Si subclase está en mismo paquete
  2. Si subclase es en paquete diferente

I. Mismo paquete:
- Se puede acceder a través de la herencia
- Se puede acceder creando una instancia de la clase primaria
II. Diverso paquete:
- Can única acceso a través de la herencia

Consulte la tabla siguiente para todos los casos de uso:

enter image description here

Cuestiones relacionadas