Clases e Instancias (u objetos)En la Programación Orientada a Objetos, frecuentemente se suele confundir a las clases con sus instancias. Primero, vamos a aclarar un poco el concepto.
Las ClasesUna Clase es una especie de "plano", contiene todas las características y funciones o métodos que realizaran alguna acción sobre un objeto.
En Java definimos las clases por medio de la palabra reservada "class". Para el ejemplo vamos a definir una clase que nos pueda representar una bicicleta de velocidades y que nos permita cambiar de marcha, pedalear, frenar;
public class Bicicleta {
public String marca;
public String color;
public String dueño;
public int numeroMarchas;
public int velocidadMaxima;
private int marchaActual;
public int velocidadActual;
public Bicicleta() {
marca = "";
color = "";
dueño = "";
numeroMarchas = 3;
marchaActual = 1;
velocidadActual = 0;
velocidadMaxima = 0;
}
public void cambiarMarcha(int nuevaMarcha) {
this.marchaActual=nuevaMarcha;
}
public void pedalear() {
if(velocidadActual<velocidadMaxima)
velocidadActual+=1;
}
public void frenar() {
if(velocidadActual>0)
velocidadActual-=1;
}
}
Una clase por si sola realmente no nos sirve para mucho ya que simplemente es una representación abstracta de una bicicleta, en teoría cuando pensamos en clases debemos de pensar en la forma de describir de manera abstracta un objeto específico. Así podríamos tener otra clase llamada "Carro", "Avion", etc. Incluso podríamos generalizar aún más el concepto y podríamos crear una Clase llamada "MedioDeTransporte".
La Instancia de la clase (el objeto)Las instancias de clase representan los objetos que realmente vamos a trabajar. En Java creamos los objetos por medio de la palabra "new", el objeto nos representa algo especifico. Por ejemplo podemos tener una bicicleta marca Haro de 1 marcha, color rojo y que puede llegar hasta unos 40Km/h.
Vamos a codificarla:
public class Main {
public static void main(String args[]) {
Bicicleta bicicletaDeMx = new Bicicleta();
bicicletaDeMx.dueño = "Mxgxw";
bicicletaDeMx.marca = "Haro";
bicicletaDeMx.color = "rojo";
bicicletaDeMx.numeroMarchas = 1;
bicicletaDeMx.velocidadMaxima = 40;
}
}
Si revisamos el código podemos observar que la "clase" es nuestro tipo de objeto, es decir podemos representar cualquier tipo de bicicleta con nuestra clase, sin embargo para identificar la "bicicleta del mx" creamos una nueva instancia con la palabra "new".
¿Que tal si hacemos una competencia? Ok bueno, hagamos una clase que se llame competencia y que nos sirva para poner a competir a tres bicicletas
public class Competencia {
public Bicicleta b1;
public Bicicleta b2;
public Bicicleta b3;
private int distanciaB1;
private int distanciaB2;
private int distanciaB3;
public int distanciaMáxima;
public Competencia() {
distanciaB1 = 0;
distanciaB2 = 0;
distanciaB3 = 0;
distanciaMáxima = 30;
}
public void iniciar() {
if( b1==null || b2==null || b3==null) {
System.out.println("Deben de haber al menos 3 competidores para iniciar la competencia");
}
while(true) {
distanciaB1 += b1.velocidadActual;
distanciaB2 += b2.velocidadActual;
distanciaB3 += b3.velocidadActual;
if(distanciaB1>=distanciaMáxima || distanciaB2>=distanciaMáxima || distanciaB1>=distanciaMáxima) {
if(distanciaB1>distanciaB2) {
if(distanciaB1>distanciaB3) {
System.out.println("El ganador es "+b1.dueño);
} else if(distanciaB1==distanciaB3) {
System.out.println("Empate entre "+b1.dueño+" y "+b3.dueño);
} else {
System.out.println("El ganador es "+b3.dueño);
}
} else if(distanciaB1==distanciaB2) {
if(distanciaB1>distanciaB3) {
System.out.println("Empate entre "+b1.dueño+" y "+b2.dueño);
} else if(distanciaB1==distanciaB3) {
System.out.println("Empate triple entre "+b1.dueño+", "+b2.dueño+" y "+b3.dueño);
} else {
System.out.println("El ganador es "+b3.dueño);
}
} else {
if(distanciaB2>distanciaB3) {
System.out.println("El ganador es "+b2.dueño);
} else if(distanciaB2==distanciaB3) {
System.out.println("Empate entre "+b2.dueño+" y "+b3.dueño);
} else {
System.out.println("El ganador es "+b3.dueño);
}
}
break;
}
}
}
}
Ojo: Noten que nuestra competencia considera también empates.
¿Que tal si les hacemos un par de bicicletas a Morph y a Salvadoresc también?
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Bicicleta bicicletaDeMx = new Bicicleta();
bicicletaDeMx.dueño = "Mxgxw";
bicicletaDeMx.marca = "Haro";
bicicletaDeMx.color = "rojo";
bicicletaDeMx.numeroMarchas = 1;
bicicletaDeMx.velocidadMaxima = 40;
Bicicleta bicicletaDeMorph = new Bicicleta();
bicicletaDeMorph.dueño = "Morph";
bicicletaDeMorph.marca = "Haro";
bicicletaDeMorph.color = "blanca";
bicicletaDeMorph.numeroMarchas = 2;
bicicletaDeMorph.velocidadMaxima = 50;
Bicicleta bicicletaDeSalvadoresc = new Bicicleta();
bicicletaDeSalvadoresc.dueño = "Salvadoresc";
bicicletaDeSalvadoresc.marca = "Haro";
bicicletaDeSalvadoresc.color = "azul";
bicicletaDeSalvadoresc.numeroMarchas = 3;
bicicletaDeSalvadoresc.velocidadMaxima = 60;
Competencia granPremioSvCommunity = new Competencia();
granPremioSvCommunity.distanciaMáxima = 60;
granPremioSvCommunity.b1 = bicicletaDeMx;
granPremioSvCommunity.b2 = bicicletaDeMorph;
granPremioSvCommunity.b3 = bicicletaDeSalvadoresc;
// Dejemos que el azar decida quien pedalea más veces
for(int i=0;i<(Math.random()*3);i++) {
bicicletaDeMx.pedalear();
}
for(int i=0;i<(Math.random()*3);i++) {
bicicletaDeMorph.pedalear();
}
for(int i=0;i<(Math.random()*3);i++) {
bicicletaDeSalvadoresc.pedalear();
}
granPremioSvCommunity.iniciar();
}
}
Salida:
run:
Empate triple entre Mxgxw, Morph y Salvadoresc
BUILD SUCCESSFUL (total time: 0 seconds)
Cuando uno programa en lenguajes Orientados a Objetos debe procurar pensar en en modelar el problema como los objetos que queremos representar.
Para nuestro caso hemos usado dos clases, Bicicleta y Competencia. Luego instanciamos estas clases creando tres bicicletas una para el Mx, otra para Morph y otra para Salvadoresc. Luego instanciamos una competencia llamada "Gran Premio SvCommunity".
Pueden notar que las acciones se realizan sobre los objetos y no sobre la clase, por ello es necesario instanciar las clases para poder solventar nuestro problema.
En algunos lenguajes Orientados a Objetos como "Javascript" no hay diferencia entre una clase y su instancia ya que los objetos se instancian al momento de definirse.
Espero que este ejemplo les resulte fácil y entretenido. Nos vemos en la próxima faskdfjh kfsdahfkdjfas
¿Quien más se anima a modelar otra situación de la vida diaria con Java?