You are on page 1of 2

Variables de Instancia y Variables de Clase

Cuando se define una clase en POO, las variables que se


definen dentro de ella son variables que tendrn
diferentes valores con cada una de las instancias que se
generan al crear objetos nuevos de la clase.

Una variable de instancia normalmente se define como
privada, para que no se pueda modificar desde otra clase,
solo a travs de los mtodos (como lo vimos en la clase
Punto con el obtenX() y el cambiaX()), pero puede ser
definida como pblica y en ese caso no se requiere de
hacer uso de algn mtodo para tomar su valor o
modificarla (no es recomendable por el control de la
variable por la misma clase).

Una variable de clase es aquella que solamente tiene un
valor para toda la clase y debe ser definida como static
(esttica) para que no se cree un nuevo valor con cada
instancia.

La palabra static nos sirve para definir algo que no tiene
que ver con las instancias de la clase, sino con toda la
clase.

Cuando a alguna variable o a algn mtodo le
anteponemos la palabra static, esto define que ser nica
(variable) o nico (mtodo) para toda la clase.

Las variables de instancia se utilizan a travs de los
mtodos de la clase y estos son utilizados por objetos. Es
decir si tenemos la clase Cuenta, para utilizar la cuenta
bancaria, con el constructor vacio Cuenta() y el
Constructor(double saldo) con parmetro y definimos
algunos objetos como lo siguiente:

Cuenta juan, pedro, luis;
juan = new Cuenta();
pedro = new Cuenta(1500.0);
luis = new Cuenta(3000.0);

Al usar la palabra new estamos creando un nuevo objeto
de la clase y con esto estamos utilizando una nueva
plantilla de variables de instancia para el objeto creado,
juan, pedro y luis son objetos nuevos de la clase Cuenta y
por cada variable que tiene definida Cuenta en
la clase, cada uno de estos objetos podr tener un valor
diferente.

IMPORTANTE. Es sumamente importante que despus
de declarar un objeto para una clase (Cuenta
objeto;) hagamos la creacin del objeto, es decir
utilicemos la instruccin new Cuenta() para ese objeto (
objeto = new Cuenta(); ) de otra manera el objeto no ha
sido creado y no se pueden utilizar los mtodos, pues
Java marcar el error NullPointerException.

En el ejemplo anterior, si tenemos el mtodo
setSaldo(double saldo), para modificar el saldo de la
cuenta y el mtodo getSaldo(), para acceder al saldo de
la cuenta, las siguientes pudieran ser instrucciones
vlidas:

luis.setSaldo(2200.0);
juan.setSaldo(350.50);
System.out.println("Saldo de pedro = " +
pedro.getSaldo());
La manera de utilizar un mtodo por un objeto es
utilizando el formato objeto.mtodo(parmetros); .
El siguiente es un ejemplo que muestra el uso de las
variables de instancia y variables estticas. Supongamos
que tenemos en la clase Punto una variable de clase
llamada puntos, esta variable nos servir para saber el
nmero de objetos que se han creado en la clase, la clase
Punto a usar sera:
public class Punto
{
private int x; // variable para la coordenada en x
private int y; // variable para la coordenada en y
private static int puntos=0;

public Punto() { // metodo para construir un objeto sin parmetros
x = 0;
y = 0;
puntos++;
}
public Punto(int x, int y) { / / mto do pa ra constr uir un objet o con va lores e nteros
this.x = x;
this.y = y;
puntos++;
}
public Punto(double x, double y) { // mtodo para construir un objeto con valores double
this.x = (int) x;
this.y = (int) y;
puntos++;
}
public Punto(Punto obj) { // m todo para co nstruir un objeto co n otro o bjeto
this.x = obj.obtenX();
this.y = obj.obtenY();
puntos++;
}
public int obtenX() { / / mto do que te d e l val or de la coordena da x
return x;
}
public int obtenY() { // m todo que te d el va lor de la coo rde nada y
return y;
}
public void cambiaX(int x) { // mtodoquesirve parac ambiar el valor //del a coordenadax
this.x = x; // this se utiliza porque se esta utilizando (x)como parmetro y c omo variablede instanciay esto es paraque no seconf
}
public void cambiaY(int y) { // mtodoquetes irvepara cambiar el val or dela c oordenaday
this.y = y; / / this se utiliza porque se esta utilizando (y) //comoparmetro y c omo // variable de instancia y esto es
}
public void dibujaPunto(Graphics g) { // dibuja un punto
g.fillOval(x,y, 5, 5);
}

public String toString() { // para o btene r un o bjeto P unto e n format o St ring
return "(" + obtenX() + "," + obtenY() + ")";
}
public static int getPuntos() { // para acceder a la cantidad de objetos creados
return puntos;
}

}


Nota que la variable puntos y el mtodo getPuntos()
ambos fueron definidos como estticos, esto implica que
ser un solo valor de esto para toda la clase, no un valor
diferente por instancia (objeto) creada de la clase.
Tambin observa como la variable puntos es
incrementada en uno cada vez que se crea un objeto de
la clase (en cualquier constructor). Esta clase la
podemos utilizar con la aplicacin:

public class AplicacionPunto1
{
private static Punto a, b, c, d, e;

public static void main(String[] args)
{
a = new Punto();
System.out.println(" Punto a = " + a.toString());
System.out.println("Puntos creados =" +
Punto.getPuntos());
b = new Punto(1, 2);
c = new Punto(3.0, 4.0);
System.out.println(" Punto b = " + b.toString());
System.out.println(" Punto c = " + c.toString());
System.out.println("Puntos creados =" +
Punto.getPuntos());
d = new Punto(b);
e = new Punto(c);
System.out.println(" Punto d = " + d.toString());
System.out.println(" Punto e = " + e.toString());
System.out.println("Puntos creados =" +
Punto.getPuntos());
}
} El resultado que nos mostrara sera:

Observamos como es que despus de crear el elemento a
y desplegar el valor de puntos creados, solo despliega 1,
despus al crear b y c, se tienen 3 y al final ya se tienen
los 5.
Tambin es importante hacer notar que el mtodo
getPuntos() fue utilizado a travs de la clase Punto, ya
que es un mtodo esttico y debe ser utilizado a travs
de la clase.

Lo anterior no es un requisito, pero es lo ms comn, ya
que podemos tener una llamada a un mtodo esttico,
pero a travs de un objeto de la clase y funciona
exactamente igual, veamos ahora una aplicacin que est
ligeramente cambiada, pero nos da el mismo resultado
que la anterior:

public class AplicacionPunto1
{
private static Punto a, b, c, d, e;

public static void main(String[] args)
{
a = new Punto();
System.out.println(" Punto a = " + a.toString());
System.out.println("Puntos creados =" +
a.getPuntos());
b = new Punto(1, 2);
c = new Punto(3.0, 4.0);
System.out.println(" Punto b = " + b.toString());
System.out.println(" Punto c = " + c.toString());
System.out.println("Puntos creados =" +
b.getPuntos());
d = new Punto(b);
e = new Punto(c);
System.out.println(" Punto d = " + d.toString());
System.out.println(" Punto e = " + e.toString());
System.out.println("Puntos creados =" +
e.getPuntos());
}
}
En esta aplicacin podemos observar como es que el
mtodo esttico getPuntos() tambin puede ser usado a
travs de un objeto de la clase, pero es importante
recordar que es una sola variable para toda la clase.
Recoleccin de Basura
En Java cada vez que utilizamos la palabra new, estamos
creando una nueva referencia a memoria y mas tarde
cuando ya no la usemos, no necesitamos borrarla (como
se hara normalmente en C++), ya que Java
automticamente los borra debido a una clase llamada
GarbageCollector, la cual se encarga de estar revisando
los objetos que ya son obsoletos y no se vuelven a
utilizar.
La recoleccin de memoria es una facilidad que permite a
Java reutilizar la memoria que se tena bloqueada para el
uso de algn dato primitivo (int, double, etc) o algn
objeto.
Gracias a esta facilidad de Java, el programador se olvida
de tener que estar liberando la memoria y se enfoca ms
a la mejor utilizacin de las variables y objetos de la
clase.

You might also like