En esta entrada al fin publicare los códigos que hemos venido
escribiendo en los cursos de los sábados, con una breve explicación.
Primero debemos crear un nuevo proyecto en Eclipse
Ahí se nos mostrara un asistente donde nos pedirá
información básica para crear el proyecto.
Luego crearemos la clase Persona dentro del paquete sociedad, la
clase persona contendrá los siguientes atributos y métodos:
package sociedad;
public class Persona {
private String nombre;
private float peso;
private int edad;
private boolean mujer;// true: mujer,
false: hombre
public String getNombre() {
return nombre;
}
public float getPeso() {
return peso;
}
public int getEdad() {
return edad;
}
public boolean isMujer() {
return mujer;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setPeso(float peso) {
this.peso = peso;
}
public void setEdad(int edad) {
this.edad = edad;
}
public void setMujer(boolean sexo) {
this.mujer = sexo;
}
public Persona(){
this.nombre = "pepito";
}
public Persona(String
nombre){
this.nombre = nombre;
}
protected String saludar(){
return "Hola mi
nombre es " + nombre + " tengo " + edad + " años y soy " + (isMujer() ? "mujer" : "hombre");
}
}
Ya tenemos nuestra primer clase, como podemos leer en el
código los atributos de la clase son privados, es decir que únicamente la clase
puede accesar a ellos; para cada atributo corresponden un par de métodos
públicos, uno para establecer el valor y otro para devolverlo, esto se conoce
como encapsulamiento, es decir, únicamente la clase puede acceder a sus
atributos directamente las demás clases tienen que hacerlo atraves de los
métodos destinados para ello.
Existe una convención para la definición de estos:
Los métodos que sirven para establecer el valor de un
atributo(llamados setters), por convención se escriben de la siguiente manera:
public void setAtributo(tipo atributo){
…
this.atributo = atributo;
}
Donde:
- public(modificador acceso): para que las demás
clases puedan invocar al método
- void(tipo de dato de retorno): es el tipo de
dato que nos va a regresar el método, en este caso el método no nos regresa
nada
- setAtributo(nombre del método): el nombre de los
setters por convención se escribe como set seguido del nombre del atributo que
va a modificar con la primera letra en mayúscula
- tipo atributo(parametro): el valor que se va a
establecer en el atributo
Los métodos que nos ayudan a obtener el valor de un
atributo(métodos getters), son declarados de la siguiente manera:
public tipo
getAtributo(){
…
return this.atributo;
}
La diferencia entre estos es básicamente:
Los setters no nos regresan ningún valor y reciben como parámetro
el valor que se va a establecer en el atributo.
Los getters nos regresan el valor de un atributo y no
reciben parámetros.
¿¿que pasa con el método isMujer()??
Este es un caso especial cuando se trata de tipos de datos
booleanos, para ser mas claros en lo que estamos haciendo cambia un poco la
manera de nombrar los getters , el método get lo nombramos como isMujer(), para
hacer notar que si el método nos regresa true se trata de una mujer y false si
se trata de un hombre.
Ya tenemos la clase persona, pero una persona puede tener
distintos roles en la sociedad uno de ellos podría ser un futbolista el cual es
una persona, ya que tiene los mismos atributos y métodos,
además tiene características y tareas especializadas de acuerdo a su profesión.
Ahora crearemos la clase Futbolista dentro del paquete
sociedad.atleta, la cual esta definida como:
package sociedad.atleta;
import java.util.ArrayList;
import sociedad.Persona;
import
sociedad.atleta.util.PosicionFutbol;
public class Futbolista extends Persona {
private String equipo;
private ArrayList<PosicionFutbol> posicion;
public String getEquipo() {
return equipo;
}
public ArrayList<PosicionFutbol>
getPosicion() {
return posicion;
}
public void setEquipo(String equipo) {
this.equipo = equipo;
}
public void
setPosicion(ArrayList<PosicionFutbol> posicion) {
this.posicion = posicion;
}
public void
addPosicion(PosicionFutbol posicion){
if(this.posicion == null)
this.posicion = new ArrayList<PosicionFutbol>();
this.posicion.add(posicion);
}
public Futbolista(){}
public Futbolista(String nombre, String
equipo){
setNombre(nombre);
this.equipo = equipo;
}
@Override
public String saludar(){
String
saludo = "Soy " + getNombre() + " juego en el
" +
equipo + ", y soy
";
for(PosicionFutbol p : posicion)
saludo
+= p + ",";
return super.saludar() + "\n" + saludo;
}
}
Para indicar que Futbolista es una Persona y hereda todos
sus atributos y métodos public y protected, utilizamos la palabra
extends seguida del nombre de la clase de la cual hereda.
Tanto Futbolista como Persona tienen el método saludar, pero
se comportan de manera diferente esto se conoce como polimorfismo, ya que
cambia el comportamiento del método dependiendo de la clase que lo invoque.
Para ser mas claro e indicar que estamos sobreescribiendo el método usamos la
anotación @Override, de esta manera podemos identificar mas rápidamente los
métodos que han sido sobreescritos.
Si deseáramos invocar al método de la clase Persona
utilizamos super, que nos sirve para invocar métodos y
constructores de la clase padre, se utiliza de la siguiente manera:
super.metodo(); //cuando se trata de un método
//cuando se trata de
constructores
super();
super(param1, …);
También notamos que la clase Futbolista tiene un atributo
posicion que es un arreglo que almacena datos tipo PosicionFutbol el cual es un
enum.
¿qué es un enum?
Es un conjunto de constantes que se relación entre si, en
nuestro caso serán las posiciones que puede desempeñar un jugador: defensa,
delantero, portero, medio.
Definimos esta enum en el paquete sociedad.atleta.util de la
siguiente manera:
package
sociedad.atleta.util;
public enum PosicionFutbol{
DELANTERO, DEFENSA, PORTERO, MEDIO
}
Las posiciones se escriben en mayúsculas ya que por convención
las constantes se escriben asi. De esta manera podemos acceder a
ellas de la siguiente forma:
PosicionFutbol.DELANTERO;
PosicionFutbol.DEFENSA;
…
Para ver en acción las clases que hemos escrito crearemos
una clase que contenga el método main, por conveniencia y de manera que podamos
abstraer mas nuestro código creamos una clase en otro paquete que contenga el
método main y desde ahí es donde instaciamos nuestras clases.
Una sugerencia de esta clase es la siguiente:
package main;
import
sociedad.atleta.Futbolista;
import
sociedad.atleta.util.PosicionFutbol;
public class Main {
public static void main(String[] args) {
Futbolista jorge = new Futbolista("Jorge
Campos","Pumas");
jorge.setEdad(34);
jorge.addPosicion(PosicionFutbol.PORTERO);
jorge.addPosicion(PosicionFutbol.DELANTERO);
System.out.println(jorge.saludar());
}
}
Donde instanciamos una clase del tipo futbolista e
invocamos sus métodos setEdad(), addPosicion() y saludar()
Después de ejecutar el código en la consola nos debe de
aparecer esto:
Al final la estructura de directorios que tendremos será la
siguiente:
Eso ha sido todo en esta entrada, son los códigos que hemos realizado hasta el momento con algunas modificaciones.
Saludos!!!