1

Sé que campo estático no específico a un objeto pero no sé lo que significa en realidad. En particular cuando hizo:

public class Static {
    private int value ;
    private static int staticValue ;

    public static void main(String[] args) {
        Static st1=new Static() ;
        Static st2=new Static() ;
        System.out.println(st1.value++) ;
        System.out.println(Static.staticValue++) ;
        System.out.println(st2.value++) ;
        System.out.println(Static.staticValue++) ;
    }
}

Me devuelve:

0
0
0
1

Pensaba que incrementa value de st1 pero persiste con st1 = 0 pero no.

Pensaba que al hacer el primero Static.staticValue++, staticValue, staticValue, se convertiría en 1 pero no.

Por eso no entiendo por qué finalmente se convierte en 1 con el último Static.staticValue++.

Revolucion for Monica
  • 4,154
  • 4
  • 28
  • 80
  • Dime si esto no resuelve lo que vos pensas que esta mal.. https://es.stackoverflow.com/a/382/324 – gbianchi Apr 08 '19 at 18:03
  • [Aquí tienes una clarísima explicación](https://beginnersbook.com/2013/05/static-variable/) sobre las variables estáticas y su funcionamiento. – A. Cedano Apr 08 '19 at 18:30

4 Answers4

3

Creo que tenes un error de percepción de lo que tu código esta haciendo.. analicemoslo un poco a ver si entendemos que pasa...

Nuestra clase Static viene asi:

public class Static {

Hay una variable no estatica, o sea que depende de cada instancia

    private int value ;  

Y una variable estatica, que no depende de cada instancia.

    private static int staticValue ;

Ahora en tu main sigamos el recorrido de cada clase y cada variable

public static void main(String[] args) {

Hay dos variables de tipo Static (el nombre de la clase, no el tipo de variable)..

    Static st1=new Static() ;
    Static st2=new Static() ;

Y ahora, empezamos a imprimir... sigamos el recorrido de cada variable al imprimir:

    System.out.println(st1.value++) ;                  

Acabamos de imprimir la variable no estatica value, y despues le sumamos uno chequea esta respuesta para ver el porque. En este caso, lo unico que se modifico es que st1.value ahora si vale 1

    System.out.println(Static.staticValue++) ;

Acabamos de mostrar y sumar 1 a una variable estatica (ahora si). Entonces esa variable, ahora vale 1 para todas las instancias.

    System.out.println(st2.value++) ;

Para st2.value sigue valiendo 0, por lo tanto ocurre lo mismo que en primer println

    System.out.println(Static.staticValue++) ;

Y ahora si, como Static.staticValue ya valia 1, imprime tu 1, y despues aumenta el valor a 2.

gbianchi
  • 19,675
  • 11
  • 38
  • 58
2

"St1" y "st2" son dos instancias diferentes de un objeto. Además, no tienes inicializada la variable "staticValue", por eso te asigna un 0 en los primeros outputs.

El fundamento de una variable static, es que se puede acceder a ella sin necesidad de crear una instancia del objeto que la encapsula.

Si estuvieras en una clase diferente podrías incrementar la variable "staticValue", de la siguiente manera: Static.staticValue++ (Sin necesidad de crear una instancia del objeto "Static").

Ahora paso al código, voy a explicar cada System.out.println:

1) El primero: Aqui lo que haces es incrementar el valor de "staticValue"de la instancia st1. Al no estar inicizilizado te asigna el valor 0.

2) El segundo: Aqi accedes a la variable statica de la clase principal. Al igual que en lo anterior, al no estar inicializada se asigna un 0 en el primer incremento.

3) El tercero es lo mismo que en el primero solo que con la instancia st2.

4) En este vuelves a acceder "staticValue" de la clase principal. Anteriormente, hemos dicho que está a 0, lo incrementa y, obtienes un 1.

1

Cuando utilizas el operador ++ despues de una variable, este retorna el valor previo que tenia y actualiza el valor de la variable. Mientras que el operador ++ delante de la variable actualiza el valor de la variable y retorna su nuevo valor:

int value = 0;
print(value++);// retorna el valor 0 que era su valor anterior pero value ahora es gual a 1
print(value);// imprime 1 que es el valor actualizado

Mientras con el operador pre-increment:

int value = 0;
print(++value);// actualiza el valor a 1 y retorna su nuevo valor
print(value);// imprime 1 que es el valor nuevo

Por lo que si cambias el orden el operador te funcionara como esperas:

Static st1=new Static() ;
Static st2=new Static() ;
System.out.println(st1.value++) ;
System.out.println(++Static.staticValue) ;
System.out.println(st2.value++) ;
System.out.println(++Static.staticValue) 
Einer
  • 20,190
  • 2
  • 14
  • 36
0

Tomando variable = 0 como referencia:

++variable indica preincremento. Esto significa que primero se incrementa el valor de variable y después se devuelve su valor, una vez incrementado.

System.out.println(++variable); // Devolverá 1

variable++ indica postincremento. Esto significa que primero se devuelve el valor de variable, y después se incrementa.

System.out.println(variable++); // Devolverá 0

De ahí que el incremento de valor de Static.staticValue solo se aprecie en el segundo print.

smt
  • 580
  • 4
  • 16