Una variable protegida es accesible, mientras que el otro no lo es. ¿Por qué?

JustAFellowCoder:

Esta es una cuestión de herencia protegida. Entiendo que los medios protegidas que en un paquete, es como si fuera pública. Fuera de un paquete, en términos generales que sólo se puede acceder cuando se está dentro de la subclase. Ese no es mi confusión. Mi confusión está en una pequeña viajera recogida que se está produciendo y no sé qué. Voy a explicar las entrañas de la cuestión después del código. Se le da paquetes com.wobble.foo que mantiene la clase Testa y com.wobble.bar que mantiene la clase TestB que se extiende classA.

//A Package
package com.wobble.foo;

public class TestA{
    static protected int x = 5;
    protected int y = 6;
}

//A different Package
package com.wobble.bar;

public class TestB extends TestA{
    static{
        TestA t = new TestA();
        t.x = 1; //compiles
        t.y = 2; //field not visible, fails to compile
    }
}

La superclase tiene unos dos variables tanto protegidas, uno estático. La subclase en un paquete diferente crea un nuevo objeto superclase intentar acceder a esas dos variables. ¿Por qué eres capaz de, a través del objeto, la variable estática de acceso a través de él, pero no accede a la variable de instancia a través de él? Ambos están protegidos. Ambos de la misma clase. Tanto el acceso por el mismo objeto. Tenga en cuenta, a los que piensan que esto podría ser un duplicado: las otras preguntas, simplemente preguntar cómo funciona protegida, pero fallan a la pregunta específica, de por qué sólo una de estas dos variables, tanto protegido, se puede acceder.

Esto no es una cuestión de cómo-a-fix-la-código. Yo sé cómo hacer funcionar el juego final. La pregunta es por eso que es accesible a través de t.x;, pero no t.y;?

Thilo:
 t.x = 1; //compiles

Se trata de un staticcampo. Por lo que debe escribir como TestA.x(habrá habido una advertencia del compilador de eso).

Estática protegida campos son accesibles desde dentro del código estático de subclases (o de código no estático para el caso).

 t.y = 2; //field not visible, fails to compile

Este es un campo de instancia. campos de instancia protegidas son accesibles desde el interior de los métodos de instancia en subclases. Pero sólo desde dentro de esos métodos. No se puede llamar desde un método estático (incluso si ese método estático pasa a estar en una subclase).

Si necesita acceder a los campos de un método estático en otra clase, que necesita para hacer bien el ámbito público o mover el código que las necesidades en el mismo paquete.


Pero sólo desde dentro de esos métodos.

Y sólo si usted puede estar seguro de que la instancia en cuestión es, de hecho, a partir de su propia clase.

En su ejemplo

TestA t = new TestA();
t.y = 2;

t.yno es visible, porque el código en el TestBque no puede acceder el campo de protección en casos de TestA. Tiene que ser una instancia deTestB . El mismo código funcionaría dentro de un método sobre TestA, sin embargo.

El siguiente no funcionará, ya sea:

// in TestB
void boo(TestA someInstance){
   this.y = someInstance.y; 
   // does not compile, because someInstance.y is not visible
   // because it could be from unknown TestC
}

Ok eso tiene sentido, pero entonces, ¿cómo puedo acceder TX? Es un miembro protegido también y todavía no estoy t.

La instancia tno se utiliza en absoluto aquí (que incluso podría sernull y el código todavía funcionaría). Un método estático solamente se envía en el tiempo de compilación (declarado) tipo de la variable. Lo ideal sería que t.x ni siquiera debería estar permitido , pero al menos se obtiene una advertencia del compilador.


es estática por lo que técnicamente no está accediendo a ella a través de la superclase, pero a través de la subclase? ietx -> x -> TestB.x el que lo consigue a través de TestB?

Los métodos estáticos no pueden ser anulados por las subclases. TestB.xes sólo una forma de confundir (o conveniente, dependiendo de cómo se mire) para escribir TestA.x. Se puede pensar en ella como la subclase importar automáticamente todos los campos estáticos (pública y protegida) y las variables de la clase padre. Lo convierte en menos pulsaciones de teclas, pero no cambia el comportamiento (por cierto funciona muy diferente de los métodos de instancia, que se envían de forma dinámica en el tipo de instancia real).

De cualquier manera, ya que TestA.xestá protegido, es accesible a los bloques de código estático en subclases de TestA, incluyendo TestB.

Supongo que te gusta

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