Clases y Objetos

Clases y Objetos

Siendo Java un lenguaje de programación orientado a objetos, su principal artefacto son los objetos ( que conste que digo principal y no único ).

De todo lo que un objeto del mundo real tiene, en la programación orientada a objetos se tomaron las siguientes cosas:

  • Los atributos del objeto. O sea sus rasgos o características
  • La forma de modificar esos atributos, osea el método para modificar un objeto

Los conceptos fundamentales de la POO son ( entre otros ):

Abstracción No es necesario conocer TODO lo que un objeto del mundo real es para poderlo usar, basta con saber lo necesario dependiendo del problema. Ejemplo un objeto persona para un sistema de venta de boletos será diferente que un objeto persona en un sistema de control escolar.

Polimorfismo Esta palabrota no hace otra cosa más que decir que objetos diferentes se comportan diferente aunque se utilice el mismo método.

Herencia Los objetos pueden tomar las características de otros objetos.

Bueno pues basta ya de blah blah , blah...

Aquí va un ejemplo:

class Cliente {
    String nombre;
    Tarjeta tarjeta;

    void comprarArticulo( Articulo a ) {
        tarjeta.cargar ( a.precio() );
    }
}

Esa es la definición de una clase en Java. Se le dice clase, porque los objetos se pueden pues... clasificar de acuerdo a sus características y comportamiento. Es decir, objetos que tienen los mismos atributos y las mismos métodos, se pueden poner en la misma clase... mhh creo que aunque parece reduntante esta es una forma muy clara de decirlo.

Entonces, como en este ejemplo lo que se quiere es modelar ( o crear software para ) un sistema donde haya clientes, lo que estoy haciendo es decir, ¿que cosa me interesa saber de este cliente? y eso agruparlo en una clase. No me interesa saber si está casado o no, no me interesa saber cuanto dinero tiene. Lo único que me interesa para este "dominio" ( el problema que estoy queriendo resolver ) es ....

  • Si tiene una tarjeta o no?( más bien o sí )
  • Quizá como se llama ( mínimo no? )
  • Y si puede comprar un artículo

Eso es todo lo que esta clase muestra. El sistema puede tener varios clientes por supuesto, y cada uno de ellos será diferente. Estos son instancias de la clase ( o muestras, o ejemplos, u ocurrencias, también ayuda a pensar en esos términos, a mí la palabra instancia me causaba conflicto inicialmente, en fin ) Estos diferentes clientes, con los articulos y las tarjetas, son los objetos del sistema.

Los atributos de las clases pueden tener otras clases y así sucesivamente. En el ejemplo el Cliente tiene una Tarjeta que también es una clase. Se puede poner como un número o un string, pero a veces ( y de nuevo dependiendo del contexto ) es más útil tener una clase.

Finalmente nuestra clase tiene un "método" ( recordemos que es la forma en la que el objeto puede hacer algo ) y ese método se llama comprarArticulo ( en Java los nombres se escriben en camelCase , los atributos y métodos comienzan con minúscula, las clases y constantes con mayúsculas ), que recibe como parametro un articulo. A lo que hace el método se le llama implementación y en este caso está delegando a la tarjeta el que le cargue el precio del artículo. El artículo es otra clase.

Para hacer eso más concreto vamos a definir las clases Tarjeta y Articulo de una forma muy básica, solamente para que se pueda compilar:

class Tarjeta {
    void cargar( int precio ) {
         // no hace nada ( por ahora )
         System.out.println("Ok, ya tarjeta ahora tiene " + precio + " menos de dinero");
    }
}
class Articulo {
    String nombre;
    int precio;
    int precio() {
        return this.precio;
    }
}

Luego podemos hacer un programita de prueba:

class SistemaDeVenta {

    public static void main( String ... args ) {
        Cliente juan = new Cliente();
        juan.nombre = "Juan";

        Articulo paleta = new Articulo();
        paleta.nombre = "Tutsi";
        paleta.precio    = 10;

         Tarjeta tarjeta = new Tarjeta();

          juan.tarjeta = tarjeta;

         juan.comprarArticulo( paleta );
    }
}

Y listo!... espero que eso le ayude a alguien que quisiera saber que de se trata esto de la programación orientada a objetos para tener una idea general de como funcionan las cosas.

Aquí está el código completo

https://gist.github.com/1190601

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de CesarAlducin

Bastante interesante tu

Bastante interesante tu comentario, a mi me gusta mucho todo lo relacionado con la Programacion Orientada a Objetos es muy importante que cuando programemos en Java lo utilizemos porque me ha tocado ver codigos donde todo lo quieren hacer en el metodo MAIN.

Me gustaria que agregaras algun ejemplo sobre este mismo de Herencia, interfaces, polimorfismo.

Seria interesante ver como lo abordas.

Saludos !!!!

Imagen de Sr. Negativo

POO: Clases y objetos

Buena explicación.

Yo era de los que usaban Main para todo. Hasta que empezé a conocer la orientación a objetos. Al principio te saca de onda lo de los objetos, herencia y polimorfismo.

La única forma de perderle miedo a algo es enfrentarsele aunque no tengas buenos resultados al inicio.

A mi me sirvio el lenguaje C con las estructura struct para comprender como se "clasifican" las propiedades de un "objeto".

struct Persona{
char nombre[60];
int edad;
};

Al fn al cabo las clases son una evolución e estas estructuras.

?:)

Imagen de VictorManuel

Gracias

Simplemente un comentario de gracias por el post, ya que siempre habia buscado algo asi :D :p apesar que ya programo poo, jajaja queria algo así bien explicadito.

Imagen de Algus Dark

Siempre me confundía...

La POO siempre se me hizo un relajo, cuando estudié la universidad mis maestros no sabían como explicarlo, o como yo siempre dije, no tenían la menor idea de qué era la POO al igual que yo. Me he estado planteando la idea de escribir algunos tutoriales en una forma sencilla de asociar las ideas ya que al principio puede ser difícil pensar de éste modo.

Muy buena explicación, mi debilidad en la POO fue en mucho tiempo el acceso public,private, abstract.

Imagen de rodrigo salado anaya

Re: Siempre me confundía...

Hola @Algus Dark, creo que aun estas un poquito confundido. Echale un ojo a estas ligas.
Controlling Access to Members of a Class:
http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Abstract Methods and Classes
http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Saludos a todos :)

@Algus @Rodrigo Aunque los

@Algus @Rodrigo Los modificadores de acceso, aunque no son conceptos de la POO sí ayudan a implementar el concepto de encapsulamiento, así que no anda tan confundido.

He estado un poco ocupado, pero lo siguiente a tratar sería, herencia, polimorfismo, encapsulamiento, interfaces etc.

Saludos.

Imagen de AlexSnake

Buenos temas

Mas el tema de polimorfismo ahi es donde me hago pelotas, pero asi como lo explicas no creo tener problema de entenderlo. Saludos.

Imagen de Algus Dark

@Rodrigo @OscaRyz

@Rodrigo: Gracias por la liga Rodrigo, si, me confundí con el abstract. Siempre lo hago, un muy mal hábito.

@OscaRyz: Si,los modificadores de acceso fueron una lata en mi universidad. Que bueno conocer gente como tú que quiera facilitar el aprendizaje para personas que prefieren un lenguaje más coloquial en las explicaciones.

Soy nuevo en Java México y me está encantando, por eso es que quiero compartir todo lo que pueda, y vaya, qué bueno entrar como un ignorante y no quedar como tal después de leer :3