Download Descripción de las clases, los objetos y cómo se relacionan, paso
Document related concepts
no text concepts found
Transcript
6 -Descripción de las clases, los objetos y cómo se relacionan, paso de mensaje Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas Descripción de las clases, los objetos y cómo se relacionan. Como dicta el titulo de este punto un objeto es precisamente eso: "Una clase en movimiento". Podemos ver la relación entre clase y objeto de este modo. Supongamos por ejemplo una clase llamada "Mamífero". Como en la "vida misma" tu te puedes encontrar por la calle con "Personas", "Perros", "Gatos" ... que evidentemente pertenecen a esa clase "Mamífero", pero no te vas a encontrar con un "Mamífero" a secas. Más o menos esa es la relación entre clase y objeto. Una clase es una especificación de cómo debe ser un objeto para pertenecer a esa clase y por consiguiente un objeto es un ejemplar individual de una clase. Tomando como ejemplo nuestra clase "Fichas" vemos que todas las fichas tienen que tener un color como característica que la defina. Es decir, nuestros objetos "ficha" serán fichas blancas, negras, etc. A la hora de "actuar" por tanto se hará sobre un objeto en concreto. En un objeto se puede acceder a sus métodos y a las variables miembro que tenga, siempre claro que sean ambos declarados en la clase como accesibles. La accesibilidad para métodos y variables depende en primera instancia de la accesibilidad a la clase a la que pertenecen. Si la clase nos es accesible entonces depende en segunda instancia de estas normas: Accesibilidad de variables y métodos: depende de los siguientes modificadores de acceso que se ponen (o no) delante de la variable en su declaración o del método en su definición. • • • • "public": Da accesibilidad completa a la variable, se puede ver desde la propia clase, dentro y fuera del mismo "package" y en cualquier "subclase" de la clase en la que se declara, ya esté en el mismo o en distinto "package". "protected": Se puede acceder desde la propia clase, desde el mismo "package" y desde cualquier "subclase", pero no se puede ver desde una clase de otro "package". "private": Solo se puede acceder desde la propia clase. "package": Es la opción por defecto (como si no se pone nada). Proporciona accesibilidad desde el propio "package" y por tanto lógicamente desde la propia clase y además desde cualquier subclase que esté dentro del mismo "package". Una vez tenemos claros las normas acerca de la accesibilidad en Java, veamos unos ejemplos de utilización de los objetos en Java. Descripción de los objetos. Cómo crearlos o instanciarlos a partir de las clases y su utilización. Lo primero que hay que hacer para utilizar un objeto es tenerlo ¿no?. Pues vamos a entender primero cómo se crean los objetos para después pasar a utilizarlos. Instanciación de objetos: Para instanciar un objeto el método que se utiliza es "new". "New" crea un objeto de la clase que le especifiquemos pero antes de esto se tiene que declarar la variable que contendrá ese nuevo objeto. Veámoslo en nuestra clase Tablero vista anteriormente. Fichas estadoTablero[][]; public Tablero(){estadoTablero=new Fichas [6][7];}; En estas dos líneas se engloba todo el mecanismo de creación de un objeto. En la primera línea se declara una variable "estadoTablero" de la clase "array". La clase "array" es una clase utilitaria de Java que esta incluida en "Java.lang" y por lo tanto, como ya se comento una vez y se explicará mejor mas adelante, se encuentra disponible desde cualquier programa en Java. En principio esta variable está vacía, no contiene ningún objeto, pero está "preparada" para contener un objeto de la clase "array". En la segunda línea de este código hay mas que comentar: Se trata de la definición de un constructor sencillo para la clase "Tablero". Cuando se ejecuta una sentencia "new" para crear un objeto de una clase, lo que realmente se hace es llamar al método constructor correspondiente a esa clase. Por ejemplo si ejecutamos esta sentencia: Tablero miTablero = New Tablero(); Estamos llamando al método anterior: public Tablero(){estadoTablero=new Fichas [6][7];}; Por tanto lo que conseguimos es crear la variable interna de "Tablero", que hemos llamado "estadoTablero" como un objeto "array" de dimensiones 6x7 que son las dimensiones de un tablero de "cuatro en raya". Como vemos, igual que con nuestra clase tablero y cualquier otra clase, también usamos "new" para crear el "array". Por último, y como puedes comprobar, para definir un constructor para la clase simplemente definimos un método que como peculiaridad tiene el mismo nombre de la clase en la que se define. En cuanto a su modificador de acceso lo normal es que sea "public", pero puede ser también "private" en cuyo caso solo será accesible desde un método "static" de la misma clase. Paso de mensajes: Como "paso de mensajes" se entiende en programación orientada a objetos lo que siempre hemos llamado en programación tradicional: "llamada a una función". En el fondo si nos ponemos a pensar vemos básicamente que: • • • • En primer lugar: Los programas "sobre el papel" son las clases. En segundo lugar: Las clases "sobre papel" se relacionan con otras clases. Por ejemplo nuestra clase Ficha utiliza para definir su parámetro "color" a la clase "String" propia de Java. En tercer lugar: En la "vida real", es decir, en funcionamiento, las clases se muestran como "objetos". Como conclusión: Son los objetos los que colaboran y se relacionan con otros objetos, y lo hacen mediante el "paso de mensajes". Para ejecutar un método de una clase se utiliza esta sintaxis: NombreDeLaClase.nombreDelMetodo(parámetros del método); Los pasos de mensajes tienen una ventaja con respecto a las llamadas a función de los lenguajes tradicionales. La ventaja es que siempre llevan un parámetro implícito: El objeto al que pertenece el propio método. Lo vemos con un ejemplo muy sencillo. Imaginamos un método y una función que simplifican una fracción pasada como parámetro. La diferencia seria la siguiente al utilizar tanto el método como la función. Programación tradicional: fraccion_simp = simplifica_fraccion(fraccion); /*fraccion_simp guarda el resultado de aplicar la función simplifica_fraccion al parámetro fraccion*/ Programación orientada a objetos: ObjetoFraccion.simplificaFraccion(); /*este caso lo podríamos entender como que simplemente le decimos a la fracción que se simplifique a ella misma "como ella sabe" */ Como vemos en Programación orientada a objetos no se pasa como parámetro la fracción a simplificar puesto que es el mismo objeto el que es la fracción y el que a su vez posee el método para simplificarla de acuerdo con sus atributos internos. Acceso a variables internas de un objeto: Para acceder a una variable interna de un objeto esta nos tiene que ser accesible según las normas vistas anteriormente. En caso de que si simplemente podemos acceder a ella con la siguiente sintaxis: NombreDeLaClase.nombreDeVariableInterna; Por ejemplo supongamos que creamos un objeto de tipo ficha y se accederá al atributo color de ficha desde la clase tablero (para este caso Ficha y tablero deben estar e el mismo paquete) public class Tablero{ Ficha objFicha; public void metodoEjemplo{ objFicha.color = “Azul”; System.out.println(objFicha.color); } } La referencia de variables y métodos con this: En Java la palabra reservada this se usa para acceder a variables y métodos del mismo objeto (ya creado) para facilitar la programación. This no se puede usar con llamadas static de métodos. public class Fecha { private int dia, mes anio: public void manana(){ this.dia = this.dia + 1; } } En este código resulta redundante el uso del this, pero puede entenderse que this.dia es la variable de la clase. En el siguiente ejemplo se fija un número de día pasando al método fijaDia(). public class Fecha{ private int dia, mes, anio; public void fijaDia(int dia){ this.dia = dia; } } Este ejemplo es completamente valido y legal, ya que el primer elemento de la asignación se refiere a la variable de la clase, y el segundo elemento de la asignación al parámetro del método fijaDia. Ahora se vera un ejemplo que utilice lo hasta ahora visto: import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class JugarGlobo extends Applet implements ActionListener { private Button agrandar, reducir; private Globo miGlobo; public void init() { agrandar = new Button ("Agrandar"); add (agrandar); agrandar.addActionListener(this); reducir = new Button ("Reducir"); add (reducir); reducir.addActionListener(this); miGlobo = new Globo (20, 50, 50); } public void actionPerformed(ActionEvent event) { if (event.getSource() == agrandar) miGlobo.cambiarTamaño(10); if (event.getSource() == reducir) miGlobo.cambiarTamaño(-10); repaint(); } public void paint (Graphics g) { miGlobo.mostrar(g); } } import java.awt.*; class Globo{ private int diametro; private int xCoord, yCoord; public Globo (int diametroInicial, int xInicial, int yInicial) { diametro = diametroInicial; xCoord = xInicial; yCoord = yInicial; } public void cambiarTamaño (int cambio) { diametro = diametro + cambio; } public void mostrar (Graphics g) { g.drawOval (xCoord, yCoord, diametro, diametro); } } A continuación se visualiza la vista de paquetes que provee elipse. Y la siguiente figura visualiza la aplicación una vez ejecutada: Para el Lector: Como ejercicio practico visualice la forma en que en el explorador de paquetes eclipse marca las características de las clases, atributos métodos, de color son las clases, que pasa cundo algo es estático, cundo es privado etc.