Java: ejemplo de clase y objeto

Vamos a escribir una pequeña clase “Persona.java”. Como esta clase tiene que ser un modelo de persona, contará con unos atributos como Nombre, Edad, Ciudad y Telefono, por ejemplo.
Cada objeto de esa clase responderá a ese patrón y tendrá unos valores propios para esos atributos.
Vamos allá con el contenido de Persona.java. Lo primero es definir la clase. la marcaremos como pública para poder utilizarla luego desde otro lugar y obviamente le llamaremos “Persona”, por lo tanto:
public class Persona {

}
Dentro de la clase, tenemos que establecer los atributos:
public class Persona {

private String nombre;
private int edad;
private String ciudad;
private int telefono;

}
Como se puede ver, se escribe el tipo y luego el nombre del atributo. Están declarados como privados, para que solamente sea accesibles desde esta clase. ¿Como serán accesibles? Mediante los métodos que declaremos. Obviamente, si no pudiésemos consultar o modificar sus valores, establecer unos atributos no tendría mucho sentido en este programa.
Vamos a hacer tres tipos de métodos:
El primer tipo se refiere al constructor, que es un método que nos dará una instancia (un objeto) de la clase a la que pertenece (nos dará una persona en nuestro caso).
En segundo lugar tendremos unos métodos que establecen unos valores (comunmente se les denomina métodos set) y otros que nos permitan consultar sus datos (métodos get).

El constructor es simplemente un método que nos devuelve un objeto, así que puede llamarse perfectamente como la clase:
public class Persona {

private String nombre;
private int edad;
private String ciudad;
private int telefono;

public Persona (String n, int e, String c, int t){
this.nombre = n;
this.edad = e;
this.ciudad = c;
this.telefono = t;
}

}
Como seguramente intuyes, construye el objeto con los parametros que le pasamos: n, e, c, t.
Podemos crear un constructor sin parametros para los casos en los que no queramos establecerlos de antemano. Java nos permite llamarlo igual, y usará uno u otro según el número de parámetros con el que luego se llame al constructor. Si el numero de parámetros es 4, usará el constructor que acabamos de definir, si es 0 usará el que definiremos ahora y en otro caso arrojará un error en tiempo de compilación. Por seguridad, en el constructor sin parámetros pondremos unos valores por defecto para evitar que haya basura en las variables inicialmente.
public class Persona {

private String nombre;
private int edad;
private String ciudad;
private int telefono;

public Persona (String n, int e, String c, int t){
this.nombre = n;
this.edad = e;
this.ciudad = c;
this.telefono = t;
}

public Persona (){ //Constructor sin param.
this.nombre = ""; //nombre vacio
this.edad = 0; //edad cero
this.ciudad =""; //ciudad vacia
this.telefono = 0; //telefono cero
}

}

Ya para terminar, programaremos 5 métodos: el primero cambia el valor de la edad del objeto sobre el que se aplique (método set). Los cuatro restantes servirán para consultar datos (métodos get). La denominación set y get es algo que se hace entre programadores de java, pero no estamos obligados a llamar así a nuestras operaciones.

public class Persona {

private String nombre;
private int edad;
private String ciudad;
private int telefono;

public Persona (String n, int e, String c, int t){
this.nombre = n;
this.edad = e;
this.ciudad = c;
this.telefono = t;
}

public Persona (){ //Constructor sin param.
this.nombre = ""; //nombre vacio
this.edad = 0; //edad cero
this.ciudad =""; //ciudad vacia
this.telefono = 0; //telefono cero
}

public void cambiarEdad (int e){
this.edad = e;
}

public String consultarNombre (){
return nombre;
}

public int consultarEdad (){
return edad;
}

public String consultarCiudad (){
return ciudad;
}

public int consultarTelefono (){
return telefono;
}

}
Hay algo que no he comentado hasta ahora. El uso de la palabra “this”. Como norma general, se usará en los constructores y en los métodos set para referirnos a los atributos del objeto recibido a las cuales alteraremos su valor. En los métodos de tipo get por lo general se puede obviar.

Bien, ya tenemos nuestra primera clase completa. Los que hayáis visto la asignatura de Estructura de Datos y de la Información (EDI) sin duda reconoceréis cierto parecido con los TADs de Pascal. De eso se trata exactamente. Ahora necesitamos un programa que instancie (pida) un objeto de la clase Persona y trabaje con él. Vamos a hacer un programa pequeño y sencillo. Lo guardaremos en un archivo llamado Amigos.java y contendrá lo siguiente:
class Amigos{

public static void main (String[] args){
Persona p1 = new Persona ("Pepe", 37, "Lugo", 611223344);
Persona p2 = new Persona ();
}

}

Por ahora nuestro programa Amigos instancia dos objetos de la clase persona: el primero, p1, es construido pasandole unos datos iniciales, mientras que p2 se genera con el constructor sin parámetros, así que su nombre y su ciudad estarán vacias y su edad y su teléfono será respectivamente cero. Probemos a mostrar algo por pantalla agregando algunas líneas (recordemos que + sirve para concatenar cadenas de caracteres):
class Amigos{

public static void main (String[] args){
Persona p1 = new Persona ("Pepe", 37, "Lugo", 611223344);
Persona p2 = new Persona ();

System.out.println ("P1:");
System.out.println ("Nombre: "+p1.consultarNombre());
System.out.println ("Edad: "+p1.consultarEdad());
System.out.println ("Ciudad: "+p1.consultarCiudad());
System.out.println ("Telefono: "+p1.consultarTelefono());

System.out.println ("P2:");
System.out.println ("Nombre: "+p2.consultarNombre());
System.out.println ("Edad: "+p2.consultarEdad());
System.out.println ("Ciudad: "+p2.consultarCiudad());
System.out.println ("Telefono: "+p2.consultarTelefono());
}

}

Las lineas añadidas solamente muestra los datos con los que se han creado los objetos iniciales. Deberían ser:
P1:
Nombre: Pepe
Edad: 37
Ciudad: Lugo
Telefono: 611223344
P2:
Nombre:
Edad: 0
Ciudad:
Telefono: 0

Visto esto, alteraremos la edad de P2 y consultaremos de nuevo su valor para confirmar que nuestro programa efectivamente “hace algo”:
class Amigos{

public static void main (String[] args){
Persona p1 = new Persona ("Pepe", 37, "Lugo", 611223344);
Persona p2 = new Persona ();

System.out.println ("P1:");
System.out.println ("Nombre: "+p1.consultarNombre());
System.out.println ("Edad: "+p1.consultarEdad());
System.out.println ("Ciudad: "+p1.consultarCiudad());
System.out.println ("Telefono: "+p1.consultarTelefono());

System.out.println ("P2:");
System.out.println ("Nombre: "+p2.consultarNombre());
System.out.println ("Edad: "+p2.consultarEdad());
System.out.println ("Ciudad: "+p2.consultarCiudad());
System.out.println ("Telefono: "+p2.consultarTelefono());

p2.cambiarEdad(20);
System.out.println ("Edad P2: "+p2.consultarEdad());
}

}

Por supuesto esto debe mostrar en pantalla antes de terminar que:
Edad P2: 20

Pues por ahora nada más, he subido el codigo fuente en un tarball jPersona.tar.gz al servidor para que podáis descargároslo cómodamente. Espero que sirva para que al menos se refleje claramente la forma de crear una clase, los métodos que necesitemos y como instanciar objetos a posteriori. He procurado tambien hacerlo lo más simple posible dentro de unos márgenes pero sin duda recomiendo a todos el canal de youtube de Niktutos. Es un canal dedicado al aprendizaje paso a paso de java que además se hace muy ameno con las buenas explicaciones de su autor.

Por supuesto este programa se compila con la orden:
$ javac Amigos.java
Automáticamente compilará tambien la clase Persona.java
Para ejecutarlo:
$ java Amigos

Actualización: En su momento, Atryx y yo escribimos “una revisión del código que incluye un nuevo método de la clase Persona.java para mostrar los datos y una versión más completa y eficiente de Amigos.java” que puedes descargar aquí: jPersona-v2.tar.gz

Actualización: He vuelto a revisar algunos conceptos en otro post en el que, con motivo del comentario de Diego a esta entrada, escribo un programa de ejemplo de un concesionario. Considero que es un ejemplo mucho mejor y más claro sobre la POO; así que si has estado trabajando con este post, quizás quieras echarle un vistazo 😉

Anuncios

4 pensamientos en “Java: ejemplo de clase y objeto

  1. DIEGO

    BUENAS, TENGO UN EJERCICIO EN DONDE SE DEBEN INGRESAR AUTOS(MARCA,MODELO,COLOR,ALTURA,ANCHURA Y LARGO) POR TECLADO. TENGO QUE INSTANCIAR OBJETOS DE LA CLASE AUTO Y GUARDARLOS EN UNA LISTA HASTA QUE NO SE INGRESEN MAS POR TECLADO, LAS CLASES YA ESTAN CREADAS , AQUI ESTA LO QUE TENGO DE CODIGO POR EL MOMENTO :

    package integrador;

    import Consesionario.Auto;
    import Consesionario.Comprador;
    import Consesionario.Vendedor;

    public class Consesionario {
    public Consesionario () {
    }

    public static void main(String[]args)throws IOException {
    BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));

    String marca;
    String modelo;
    String color;
    String respuesta;
    int ancho;
    int largo;
    int alto;

    System out println(“VA A INGRESAR UN COCHE? – SI/NO”);
    respuesta=lectura.readLine();

    if(respuesta != “SI” && respuesta != “NO” )break;

    while(respuesta.equals(“SI”)){

    System out println(“INGRESE LA MARCA”);
    marca=lectura.readLine();
    System out println(“INGRESE MODELO”);
    modelo=lectura.readLine();
    System out println(“INGRESE COLOR”);
    color=lectura.readLine();
    System out println(“INGRESE EL ANCHO DEL COCHE”);
    ancho=Integer.parseInt(lectura.readLine());
    System out println(“INGRESE EL LARGO DEL COCHE”);
    largo=Integer.parseInt(lectura.readLine());
    System out println(“INGRESE EL ALTO DEL COCHE”);
    alto=Integer.parseInt(lectura.readLine());

    Auto a1 = new Auto(“marca”,”modelo”,”color”,”ancho”,”largo”,”alto”);

    List lista = new ArrayList();
    lista.add(a1);

    System out println(“VA A INGRESAR UN COCHE? – SI/NO”);
    String respuesta=lectura.readLine();
    }

    NO SE COMO LOGRAR QUE SE VAYAN GENERANDO A MEDIDA QUE SE INGRESEN POR TECLADO!!

    Me gusta

    Responder
    1. Emilio Autor de la entrada

      Hola diego,

      en la línea en la que llamas al constructor de la clase Auto estás poniendo los atributos entre comillas. Al hacer esto, lo que envías es el String contenido en esas comillas. Sin embargo, tú quieres enviar los objetos String que ya tienes referenciados antes. Con quitar las comillas, debería ser suficiente para que se guardase la información correcta:
      Auto a1 = new Auto(marca,modelo,color,ancho,largo,alto);

      Te mostraré más claramente el error con este ejemplo:
      String palabra="Hola";
      System.out.println(palabra); // Esto imprime "Hola"
      System.out.println("palabra"); // Esto imprime "palabra"

      Por otra parte, cada vez que entras en el bucle estás creando una nueva lista. La lista deberías instanciarla una sola vez, ya que sino, cuando la consultes, solo contendrá el último auto creado.

      Además, usando el constructor por defecto de cualquier clase (un constructor sin parámetros) puedes construir un auto nuevo sin atributos. Luego, mediante métodos de escritura (setMarca, setColor, etc.) puedes ir leyendo y almacenando la información de forma directa.

      En definitva, y sin analizarlo en mucha más profundidad….
      public static void main(String[]args)throws IOException {

      // Creamos los objetos lectura y lista
      BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));
      List lista = new ArrayList();

      // Hacemos la pregunta inicial
      System out println(“VA A INGRESAR UN COCHE? – SI/NO”);
      String respuesta=lectura.readLine();
      if(respuesta != “SI” && respuesta != “NO” )break;

      while(respuesta.equals(“SI”)){

      // Instanciamos un auto nuevo
      Auto unAuto()=new Auto();

      // Introducimos la informacion en sus atributos
      System out println(“INGRESE LA MARCA”);
      unAuto.setMarca(lectura.readLine());

      System out println(“INGRESE MODELO”);
      unAuto.setModelo(lectura.readLine());

      System out println(“INGRESE COLOR”);
      unAuto.setColor(lectura.readLine());

      System out println(“INGRESE EL ANCHO DEL COCHE”);
      unAuto.setAnchura(Integer.parseInt(lectura.readLine()));

      System out println(“INGRESE EL LARGO DEL COCHE”);
      unAuto.setLongitud(Integer.parseInt(lectura.readLine()));

      System out println(“INGRESE EL ALTO DEL COCHE”);
      unAuto.setAltura(Integer.parseInt(lectura.readLine()));

      // Añadimos el auto a la lista
      lista.add(unAuto);

      System out println(“VA A INGRESAR UN COCHE? – SI/NO”);
      String respuesta=lectura.readLine();

      }
      }

      Como siempre, recordad que debéis comentar todo vuestro código y que es importante utilizar nombres relevantes en las variables. De la misma forma que al objeto “respuesta” no has dudado en llamarle así, deberías denominar al auto nuevo de una forma similar a como hice yo (“unAuto”), que es mucho más explicativo que simplemente “a1”.

      Espero haberte ayudado, un saludo!

      Me gusta

      Responder
  2. Pingback: Concesionario: Programa de ejemplo en Java | Emilio

  3. Pingback: Java Rápido: Introducción – Emilio Devesa

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s