No se puede hacer una referencia estática al método no estático

Resuelto Chen M asked hace 13 años • 8 respuestas

Construyendo una aplicación multilenguaje en Java. Aparece un error al insertar un valor de cadena desde R.stringun archivo XML de recursos:

public static final String TTT =  (String) getText(R.string.TTT);

Este es el mensaje de error:

Error: no se puede hacer una referencia estática al método no estático getText(int) del tipo Contexto

¿Cómo se produce esto y cómo puedo solucionarlo?

Chen M avatar Feb 11 '11 19:02 Chen M
Aceptado

Como getText()no es estático, no puedes llamarlo desde un método estático.

Para entender por qué, hay que entender la diferencia entre los dos.

Los métodos de instancia (no estáticos) funcionan en objetos que son de un tipo particular (la clase). Estos se crean con lo nuevo así:

SomeClass myObject = new SomeClass();

Para llamar a un método de instancia, lo llama en la instancia ( myObject):

myObject.getText(...)

Sin embargo, un método/campo estático solo se puede llamar directamente en el tipo, digamos así: La afirmación anterior no es correcta. También se pueden hacer referencia a campos estáticos con una referencia de objeto como, myObject.staticMethod() pero no se recomienda porque no deja claro que son variables de clase.

... = SomeClass.final

Y los dos no pueden trabajar juntos ya que operan en espacios de datos diferentes (datos de instancia y datos de clase)

Déjame intentar explicarte. Considere esta clase (psuedocódigo):

class Test {
     string somedata = "99";
     string getText() { return somedata; } 
     static string TTT = "0";
}

Ahora tengo el siguiente caso de uso:

Test item1 = new Test();
 item1.somedata = "200";

 Test item2 = new Test();

 Test.TTT = "1";

¿Cuáles son los valores?

Bien

in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99

En otras palabras, TTTes un dato compartido por todas las instancias del tipo. Entonces no tiene sentido decir

class Test {
         string somedata = "99";
         string getText() { return somedata; } 
  static string TTT = getText(); // error there is is no somedata at this point 
}

Entonces la pregunta es ¿por qué TTT es estático o por qué getText() no es estático?

Elimine el staticy debería superar este error, pero sin comprender qué hace su tipo, es solo una tirita hasta el siguiente error. ¿ Cuáles son los requisitos que getText()requieren que sea no estático?

Preet Sangha avatar Feb 11 '2011 12:02 Preet Sangha

ContextYa hay algunas buenas respuestas con explicaciones de por qué la combinación del método no estático getText()no se puede utilizar con su archivo static final String.

Una buena pregunta es: ¿por qué quieres hacer esto? Está intentando cargar a Stringdesde su stringsrecurso y completar su valor en un public staticcampo. Supongo que esto es para que algunas de tus otras clases puedan acceder a él. Si es así, no es necesario hacer esto. En lugar de eso, pasa Contexta tus otras clases y llama context.getText(R.string.TTT)desde ellas.

public class NonActivity {

    public static void doStuff(Context context) {
        String TTT = context.getText(R.string.TTT);
        ...
    }
}

Y para llamar a esto desde tu Activity:

NonActivity.doStuff(this);

Esto le permitirá acceder a su Stringrecurso sin necesidad de utilizar un public staticcampo.

dave.c avatar Feb 11 '2011 13:02 dave.c

para otros que encuentren esto en la búsqueda:

A menudo obtengo este cuando accidentalmente llamo a una función usando el nombre de la clase en lugar del nombre del objeto. Esto suele suceder porque les doy nombres demasiado similares :P

es decir:

MyClass myclass = new MyClass();

// then later

MyClass.someFunction();

Obviamente, este es un método estático. (bueno para algunas cosas) Pero lo que realmente quería hacer (en la mayoría de los casos era)

myclass.someFunction();

Es un error muy tonto, pero cada dos meses, pierdo unos 30 minutos jugando con las variables en las definiciones de "MiClase" para descubrir qué estoy haciendo mal cuando en realidad es solo un error tipográfico.

Nota curiosa: el desbordamiento de pila resalta la sintaxis para que el error sea realmente obvio aquí.

SpiRail avatar Dec 18 '2011 14:12 SpiRail