Autor Tema: Clases e Instancias de Clase (objetos)  (Leído 24027 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5666
  • Starlet - 999cc
    • mxgxw
Clases e Instancias de Clase (objetos)
« : agosto 27, 2011, 10:09:55 am »
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 Clases

Una 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;

Código: (Bicicleta.java) [Seleccionar]
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:
Código: (Main.java) [Seleccionar]
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 :)

Código: [Seleccionar]
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?

Código: [Seleccionar]
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:
Código: [Seleccionar]
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?


Desconectado fhalcon

  • The Communiter-
  • *
  • Mensajes: 1022
Re: Clases e Instancias de Clase (objetos)
« Respuesta #1 : agosto 27, 2011, 11:00:11 am »
Muchas thank you compadree...  :D

aportes como este ayudan a los noobs, como yo lo estoy en la programacion
mas que ahorita estoy aprendiendo JAVA.

 :thumbsup:

saludos y gracias
Instalacion y configuracion de camaras IP, DVR y NVR, le creamos un plan que se adapte a sus necesidades. MP

Desconectado adolira

  • Sv Member
  • ***
  • Mensajes: 440
Re: Clases e Instancias de Clase (objetos)
« Respuesta #2 : agosto 27, 2011, 11:58:49 am »
muy buen tutorial para personas que inician en la programacion orientada a objetos
<a href="http://profile.mygamercard.net/eternal258">
<img src="http://card.mygamercard.net/community/360style/eternal258.png" border=0>
</a>

Desconectado Jaru

  • The Communiter-
  • *
  • Mensajes: 13254
  • some text
Re: Clases e Instancias de Clase (objetos)
« Respuesta #3 : agosto 27, 2011, 02:48:36 pm »
otra vez lo lei todo.

solo pienso que a alguno le hubieras dado una bicicleta rosada.
N/A

Desconectado hkadejo

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 3346
Re: Clases e Instancias de Clase (objetos)
« Respuesta #4 : agosto 27, 2011, 04:51:05 pm »
Muy bueno para aprender lo basico...

Desconectado JaiMe

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 1485
  • λ | h+
Re: Clases e Instancias de Clase (objetos)
« Respuesta #5 : agosto 27, 2011, 05:09:10 pm »
Me esta gustando esta serie de posts, simples y al punto. Se aprecia el esfuerzo.

pd: removi mis ejemplos. No quiero hijack el thread.
« Última Modificación: agosto 28, 2011, 12:45:34 pm por JaiMe »
"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson

Desconectado salvadoresc

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 11658
  • Adobe Certified Expert en ACISEAPRENDE
    • Foro de Diseno - Pixeles al Desnudo
Re: Clases e Instancias de Clase (objetos)
« Respuesta #6 : agosto 27, 2011, 07:06:09 pm »
a mi en clases siempre me gusto usar una analogia similar a la que usaste, con que la clases es como el plano de una casa y los objetos las casas construidas usando el plano, me servia tambien para mostrar como las clases pueden ser escalables, por ejemplo, anhadirle una cochera a una casa, no esta en el plano original pero podrias agregarselo...
Awaken my child, and embrace the glory that is your birthright. Know that I am the Overmind; the eternal will of the Swarm.

haycoctelesamor.com

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: Clases e Instancias de Clase (objetos)
« Respuesta #7 : agosto 29, 2011, 08:25:26 am »
pregunta mxlkajsfsdak, como hago para que en la clase "Competencia" acepte N número de bicicletas....

alguna vez le escuche, bueno mejor dicho leí a un loco de por aca, escribirme en el msn.... "hey tengo una clase que genera clases" y yo pense wats?¡ lasjkdfñasljf
lo recorde, por lo que menciono salvador, respecto a la escalabilidad de las clases.
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado hkadejo

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 3346
Re: Clases e Instancias de Clase (objetos)
« Respuesta #8 : agosto 29, 2011, 08:44:27 am »
como hago para que en la clase "Competencia" acepte N número de bicicletas....

Crea dentro de Competencia un arreglo o una lista (ArrayList) de Bicicletas...de esa manera podes agregar infinita cantidad de bicicletas con el metodo add...y despues solo te queda modificar los metodos para que busque las bicicletas dentro del listado dinamicamente....

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5666
  • Starlet - 999cc
    • mxgxw
Re: Clases e Instancias de Clase (objetos)
« Respuesta #9 : agosto 29, 2011, 09:43:41 am »
pregunta mxlkajsfsdak, como hago para que en la clase "Competencia" acepte N número de bicicletas....

alguna vez le escuche, bueno mejor dicho leí a un loco de por aca, escribirme en el msn.... "hey tengo una clase que genera clases" y yo pense wats?¡ lasjkdfñasljf
lo recorde, por lo que menciono salvador, respecto a la escalabilidad de las clases.

Ya te respondió hkadejo, la mejor forma es utilizar un ArrayList.

Lo declarás de la manera siguiente:

Código: [Seleccionar]
public ArrayList<Bicicleta> bicicletas;

Dentro del constructor de igual manera tendrías que inicializarlo:

Código: [Seleccionar]
bicicletas = new ArrayList<Bicicleta>();

Ahora... un bonito ejercicio para el lector sería hacer la funcion para poner a competir n bicicletas y determinar el ganador :) Yo realmente elegí la forma más complicada, pero usando un poquito de física y conociendo previamente las velocidades puede determinarse el ganador de forma más sencilla. Luego se elije entre N participantes los que lograron recorrer la mayor distancia por medio de un algoritmo de busqueda.


Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: Clases e Instancias de Clase (objetos)
« Respuesta #10 : agosto 29, 2011, 12:20:19 pm »
Ya te respondió hkadejo, la mejor forma es utilizar un ArrayList.

Lo declarás de la manera siguiente:

Código: [Seleccionar]
public ArrayList<Bicicleta> bicicletas;

Dentro del constructor de igual manera tendrías que inicializarlo:

Código: [Seleccionar]
bicicletas = new ArrayList<Bicicleta>();

Ahora... un bonito ejercicio para el lector sería hacer la funcion para poner a competir n bicicletas y determinar el ganador

pues realmente, ese era mi punto.... muy lejos del arrayList para el instanciado de objetos bicicletas.... era como incorporarlo dentro del sub COMPETENCIA e INICIAR

pero obviamente hoy que mxgxñaskfdj lo deja como tarea, no hay mucho que pedir, porque esa parte le criticaría al tuto, al corto alcance que presenta, y el alto costo que significaba, bajo el actual lineamiento, implementarlo para una verdadera carrera, que no baja de unas 20 bicicletas...
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5666
  • Starlet - 999cc
    • mxgxw
Re: Clases e Instancias de Clase (objetos)
« Respuesta #11 : agosto 29, 2011, 02:25:03 pm »
pues realmente, ese era mi punto.... muy lejos del arrayList para el instanciado de objetos bicicletas.... era como incorporarlo dentro del sub COMPETENCIA e INICIAR

pero obviamente hoy que mxgxñaskfdj lo deja como tarea, no hay mucho que pedir, porque esa parte le criticaría al tuto, al corto alcance que presenta, y el alto costo que significaba, bajo el actual lineamiento, implementarlo para una verdadera carrera, que no baja de unas 20 bicicletas...

Lo que pasa es que no quería complicarlo demasiado como el primero. Respecto a una Competencia para N participantes (que no es el objetivo original del tema), la solución general sería la siguiente:

Citar
1-Conociendo la velocidad actual de cada bicicleta se calcula el tiempo (t=d/v) en que llegaria cada una de las bicicletas almacenadas en el ArrayList hasta distanciaMáxima.

2-Utilizando un algoritmo de ordenamiento se ordenan las bicicletas dentro del ArrayList de t menor a t mayor.

3-Se selecciona el(los) menores tiempos para determinar al ganador.
« Última Modificación: agosto 29, 2011, 02:26:49 pm por mxgxw »