Primero necesito tu código un pelín bonito que si no no lo entiendo:
Código:
//ejercicios
class A {
static int x[] = {1, 2};
int y[];
void f (int z[]) {
z[1]+=2;
}
void g ( ) {
A a = new A ( );
a.x[0]++;
}
public static void main (String args[ ]) {
A b = new A ( );
b.y = b.x;
b.f(b.y);
b.g ( );
System.out.println (b.x[0] + " " + b.x[1])
}
}
estudiemos el progreso de la aplicación:
- Creamos un nuevo objeto
A y guardamos una referencia a él en
b
- Asignamos en
b.y el valor de
A.x (aunque en el código se accede usando b.x, no debería, puesto que x es ESTÁTICO). Esta asignación significa que los dos campos contienen una referencia AL MISMO ARRAY, y no a arrays iguales (cambios en el uno afectan al otro, etc)
- Llamamos al método
b.f(int[]) con el array
b.y, el cual incrementa en 2 unidades la posicion 1 de
b.y y, por tanto, de la posición 1 de
A.x
- Llamamos al método
b.g() que crea un nuevo objeto A (todavía no sé para qué) y lo utiliza para incrementar la posición 0 del array
A.x en una unidad (de nuevo usando una instancia para acceder a un campo ESTÁTICO)
- Imprimimos las posiciones 0 y 1 del vector
A.x (de nuevo usando una instancia, que ya está empezando a dolerme), que en este punto contiene los valores 1 y 2 respectivamente
El único punto con posible dificultad es la asignación. En toda la ejecución sólo existe un array, al que nos podemos referir tanto con
A.x como con
b.y, debido a la asignación de la segunda línea del main.
Y cuidadito con usar instancias para acceder a campos o llamar a métodos que sean estáticos. Java nos deja hacerlo pero está muy desaconsejado puesto que puede llevar a confusiones como la del método g() de este código, que crea un objeto A completamente innecesario que lo único que hace es gastar tiempo y memoria. También desde Java se aconseja declarar los arrays con los corchetes en el tipo y no en el nombre de la variable:
Código:
int[] x; // Good
int x[]; // Not so good