Diferencia entre revisiones de «Prog. Fundamentos Programación Orientada a Objetos (POO)»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 87: Línea 87:
  
 
<br />
 
<br />
=Clases=
 
  
  
 +
<br/>
  
 +
=POO=
  
  
 +
<br />
 +
==Clases==
  
 +
* Una clase es un conjunto de datos y métodos que manejan esos datos.
  
 +
* Los datos y los métodos definen las características de algún tipo de objeto.
  
 +
* Por ejemplo, podemos describir un círculo por su pongo (x,y) de su centro y por el valor de su radio.
 +
: Cada círculo es diferente de los demás (en el centro o en la radio), pero como clase, todos los círculos tienen una serie de propiedades que sirven para dar una definición de círculo.
 +
: Es decir, una clase <u>consta</u> de métodos (procedimientos) y atributos (variables), que se encuentran relacionados formando un todo que llamamos clase.
  
  
 +
* '''Importante:'''
 +
:* El nombre de las clases en Java debe <u>comenzar con la primera letra en mayúsculas</u> y las siguientes primeras letras de cada palabra si tuviera más de una. Por ejemplo: '''C'''halets'''A'''dosados
 +
:* El nombre <u>debe estar en singular</u>
  
  
 +
* En Java, la creación de una clase se lleva a cabo en <u>dos pasos</u>: la '''declaración de clase''' y su '''definición'''.
  
  
 +
* La declaración general de una clase es la siguiente:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
access class Nombre_Clase [extends NombreClase] [implements NombreClase,....] { // Comienzo del código de la clase
  
 +
  [access] [static] tipo variable_de_instancia1;    // Declaramos variables
 +
  .....
 +
  [access] [static] tipo variable_de_instanciaN;
 +
  .....
  
 +
  [access] [static] tipo método1 (lista de parámetros) {  // Declaramos métodos
 +
    .....
 +
  }
 +
    .....
 +
  [access] [static] tipo métodoN (lista de parámetros) {
 +
    .....
 +
  }
 +
} // Fin del código de la clase
 +
</syntaxhighlight>
  
 +
: Más adelante veremos qué significan todas estas palabras clave ...
  
  
  
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2017).
+
<br />
 +
 
 +
==Objetos==
 +
 
 +
* Una vez que se ha definido la clase del círculo, se pueden hacer cosas con ella.
 +
: Para usar los métodos y acceder a los métodos datos, se necesita un círculo específico, no sirve la clase; se requiere una '''instancia''' de la clase: un objeto Círculo.
 +
 
 +
: La diferencia entre clase y objetos se puede ver al comparar un molde para hacer cookies con las cookies. El molde tiene todas las características de las cookies, pero no es ninguna galleta en particular.
 +
: Cada cookie (objeto) es una <u>instancia</u> de la clase de cookie (molde). El proceso de crear un objeto de una clase se llama instanciar.
 +
 
 +
 
 +
* Cada objeto tendrá un '''estado''' que estará conformado por los valores de sus atributos en un momento determinado.
 +
 
 +
 
 +
<br />
 +
 
 +
==Métodos==
 +
 
 +
* Los métodos son funciones que pueden llamarse dentro de la clase o por otras clases.
 +
: Son las acciones que se pueden realizar con un objeto dado.
 +
 
 +
: Hay muchas cosas que se pueden hacer con círculos: calcular un circunferencia, el área, ver si un determinado punto está dentro o fuera, etc.
 +
: Para aclarar todos estos conceptos, llevaremos a cabo el siguiente ejercicio.
 +
: Supongamos que queremos implementar la siguiente clase:
 +
 
 +
[[Imagen:Prog_fund_poo_1.jpg|400px|center]]
 +
 
 +
: Esta clase tiene dos atributos (variables) que son el nombre y la edad.
 +
: La forma de definir Java en esta clase es la siguiente:
 +
 
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
public class Europeo { // Comienza el código de la clase
 +
 
 +
 
 +
 
 +
} //Termina el código de la clase
 +
</syntaxhighlight>
 +
 
 +
* <u>Nota:</u> La clase tiene un modificador de acceso público (public) para indicar que la clase puede ser utilizada por otras clases. Más adelante revisaremos estos conceptos.
 +
 
 +
: En nuestro caso, la clase Europeo tiene dos variables, que deben definirse.
 +
: Para definir una variable dentro de una clase de la manera más simple: Tipo nombre_de_variable;
 +
 
 +
: En nuestro caso:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
public class Europeo { // Comienza el código de la clase
 +
  String nombre;
 +
  int edad;
 +
 
 +
 
 +
} //Termina el código de la clase
 +
</syntaxhighlight>
 +
 
 +
 
 +
* <u>Recuerda:</u> Las variables 'miembro' (las que están definidas a nivel de clase) sí se inicializan si no les damos un valor inicial. Si son de tipo numérico se inicializan a 0, si son booleanas a false y si son de referencia o cadena se inicializan a null.
 +
* <u>Recuerda:</u> Las variables 'miembro' son 'visibles' (se puede acceder a su valor) en toda la clase.
 +
 
 +
 
 +
* En este momento, hemos definido el molde de las cookies.
 +
: Es decir, definimos la clase, pero esta clase no tiene ningún valor concreto para los atributos nombre y edad.
 +
: Los valores concretos están asociados con los objetos.
 +
 
 +
[[Imagen:Prog_fund_poo_2.jpg|400px|center]]
 +
 
 +
 
 +
* '''Importante:''' Una vez que nuestra clase está escrita, es necesario guardarla en un archivo con el mismo nombre de la clase pública, en nuestro caso Europeo y extensión .java.
 +
: Dentro de un único archivo físico, podemos haber definido varias clases. Pero de todos ellas, solo una puede tener el modificador 'public' y el archivo físico deben tener el mismo nombre que esa clase.
 +
 
 +
[[Imagen:Prog_fund_poo_3.jpg|400px|center]]
 +
 
 +
 
 +
* Si no estuviéramos en el NetBeans tendríamos que 'compilar' esta clase con la orden: '''javac''' (ya visto anteriormente).
 +
 
 +
 
 +
* Crearemos en Netbeans una clase de nombre 'Principal' que tenga el método main definido de la forma:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
package aprendiendo;
 +
 
 +
/**
 +
*
 +
* @author clase
 +
*/
 +
public class Principal {
 +
 
 +
    /**
 +
    * @param args the command line arguments
 +
    */
 +
    public static void main(String[] args) {
 +
        // TODO code application logic here
 +
    }
 +
   
 +
}
 +
</syntaxhighlight>
 +
 
 +
<u>Nota:></u> El nombre del paquete será diferente al vuestro.
 +
 
 +
 
 +
* Ahora, el objetivo es usar la clase Europeo dentro de la clase Principal.
 +
: Para esto crearemos ('''instanciaremos''') 3 objetos de la clase Europeo con los siguientes datos:
 +
 
 +
[[Imagen:Prog_fund_poo_4.jpg|400px|center]]
 +
 
 +
 
 +
* ¿Cómo definimos un objeto? Para esto debemos definir un objeto de la misma manera que uno se define variable: Nombre_clase nombre_objeto;
 +
 
 +
: En nuestro caso:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
Europeos europeos1; // primer objeto
 +
Europeos europeos2; // segundo objeto
 +
Europeos europeos3  // tercer objeto
 +
</syntaxhighlight>
 +
 
 +
 
 +
* Este es un primer paso, pero a mayores, debemos asignar memoria a estos objetos.
 +
: Para esto, se usa el operador '''new''', que reserva la memoria.
 +
: Este operador sería equivalente al malloc de C.
 +
: En Java no hay operador opuesto, es decir, la liberación de memoria (free en C).
 +
: Lo máximo que podemos hacer es asignar un objeto al valor nulo y es Java que a través del proceso de recolección de basura (proceso especial, garbage collection) es responsable de liberar la memoria que ya no es utilizada por ningún objeto.
 +
 
 +
En nuestro caso:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
europeo1 = new Europeo();  // reservamos memoria
 +
europeo2 = new Europeo();  // reservamos memoria
 +
europeo3 = new Europeo();  // reservamos memoria
 +
</syntaxhighlight>
 +
 
 +
 
 +
* El proceso de reservar memoria se llama '''instanciación'''.
 +
: Estas operaciones se pueden hacer a la vez (definición e instanciación):
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
Europeo europeo1 = new Europeo(); 
 +
</syntaxhighlight>
 +
 
 +
: En esta línea, estamos haciendo 3 operaciones:
 +
:* Una declaración: declaramos europeo1 de tipo Europeo.
 +
:* Una instanciación: reservamos memoria con el operador new.
 +
:* Inicialización: más adelante veremos que cuando realizamos la creación de instancias llamamos a uno método especial (procedimiento) llamado '''constructor''' que permite inicializar todas las variables. Por defecto, ya vimos que estar variable se inicializan.
 +
 
 +
* En este momento tenemos 3 objetos de la clase europea y, por lo tanto, cada objeto tendrá los mismos atributos que la clase a la que pertenece, en este caso dos atributos (nombre y edad).
 +
 
 +
 
 +
 
 +
* ¿ Cómo asignamos valores a ditas variables ?
 +
: De la forma: obxecto.atributo = valor;
 +
 
 +
:En nuestro caso:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
europeo1.nome = “Angel”;
 +
europeo1.idade = 20;
 +
europeo2.nome = “Pepe”;
 +
europeo2.idade = 15;
 +
europeo3.nome = “Jean”;
 +
europeo3.idade = 17;
 +
</syntaxhighlight>
 +
 
 +
 
 +
 
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
</syntaxhighlight>
 +
 
 +
 
 +
<br/>
 +
 
 +
 
 +
-- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2017).

Revisión del 10:30 25 oct 2017

Introducción

  • Antes del paradigma de la POO se utilizaba la programación estructurada.
Este tipo de programación se basa en un diseño descendente (metodología top-down) y se utilizan para implementar los programas tres estructuras básicas: secuencial-condicional-repetitiva.
El programa consistía normalmente en un único archivo donde se encontraba todo el código fuente que daba una solución informática al problema del mundo real, en el que los datos se declaraban a nivel 'global' y definimos un conjunto de funciones, el que se trataban dichos datos y se informaba al usuario.
Este es un tipo de programación orientado al tratamiento de datos, a los procedimientos.
Cuando diseñas un programa utilizando este tipo de metodología piensas en las operaciones y partiendo de ellas, diseñas el programa.
Por ejemplo, si quiero dar una solución informática a la gestión de un centro de enseñanza, podría pensar (metodología top-down):
  • Necesito una gestión de los alumnos del centro.
  • Necesito una gestión de los profesores del centro.
  • Dentro de la gestión de alumnos tendré:
  • Alta => función que pida los datos y los añada
  • Baja => función que pida un identificador y de baja
  • Modificación => función que pida los datos y los modifique
  • Consulta => función que busque datos en base a diferentes criterios.
  • Dentro de la gestión de profesores tendré:
  • Alta => función que pida los datos y los añada
  • Baja => función que pida un identificador y de baja
  • Modificación => función que pida los datos y los modifique
  • Consulta => función que busque datos en base a diferentes criterios.


Los datos estarán definidos a nivel global, utilizando una estructura adecuada para guardarlos, como los arrays.



  • En el paradigma de la POO, el diseño se realiza en base a los datos y utilizando un concepto mucho más 'humano' como es el de objeto.
Un objeto es cualquier cosa que puedas identificar en el mundo real o que puedas a llegar a identificar utilizando la abstracción.
Ejemplo de objetos:
  • Un coche Opel negro matrícula 1234-ABC
  • Una matriz matemática
  • Un globo de color verde que lleva un niño
  • El ordenador con el que estás trabajando
En la POO cada de las características que posee un objeto se denomina atributo (en la Prog. Estructurada se llaman variables).
Todos los objetos 'coches' tienen un conjunto de atributos comunes (matrícula, km recorridos, color,....) por lo que en programación, para poder crear esos objetos utilizamos otro concepto denominado clase.
Una clase define todos los atributos que van a tener los objetos, pero no sus valores, sino los tipos y nombres de los atributos.
Así puedo definir:
  • Una clase Coche que tenga los atributos 'matrícula', 'km', 'color', 'estado'
  • Una clase Matriz que tenga los atributos 'fila','columna'
  • Una clase Globo, que tenga los atributos 'color','tamaño'
  • Una clase Computador que tenga los atributos 'cpu','hd','memoria','velocidadActual'


En una clase, a parte de definir los atributos, también se definen las funciones (métodos en la POO) que se pueden aplicar a los datos definidos en esa clase.
Por ejemplo:
  • La clase Globo puede tener un método 'hinchar' y otro 'deshinchar' que modificará el valor del atributo 'tamaño'.
  • La clase Coche puede tener un método 'recorrer' que modifique el valor del atributo 'km', un método 'arranca','parar','acelerar','frenar' que cambie el atributo 'estado'.
  • La clase Matriz puede tener un método 'sumar' para que modifique el valor del atributo 'matriz'.
  • La clase Computador puede tener un método 'cambiarVelocidad' que modifique el valor del atributo 'velocidadActual'.


En el ejemplo anterior de un centro de enseñanza, si aplicamos esta metodología tendríamos:
  • Una clase 'Alumno' que representaría cada uno de los alumnos
  • Con un método 'crear' que guardaría los datos de un nuevo alumno.
  • Con un método 'modificar' que modificaría los datos de un alumno.
  • El método 'eliminar' no sería necesario en esta clase ya que cuando un objeto no se utiliza, Java lo elimina con el proceso 'garbage collection'.
  • Una clase 'Profesor' que representaría cada uno de los profesores.
  • Con un método 'crear' que guardaría los datos de un nuevo profesor.
  • Con un método 'modificar' que modificaría los datos de un profesor.
  • El método 'eliminar' no sería necesario en esta clase ya que cuando un objeto no se utiliza, Java lo elimina con el proceso 'garbage collection'.
  • Una clase Centro que representaría el centro donde trabajan y estudian los alumnos y profesores.
Dentro de esta clase definiríamos:
  • Un atributo que guardaría un array de 'objetos Alumnos' que representa todos los alumnos del centro.
  • Un atributo que guardaría un array de 'objetos Profesores' que representa todos los profesores del centro.
  • Un método 'crearAlumno' que crearía un nuevo objeto Alumno (llamando al método crear) y lo añadiría al array de Alumnos.
  • Un método 'crearProfesor' que crearía un nuevo objeto Profesor (llamando al método crear) y lo añadiría al array de Profesores.
  • Un método 'eliminarAlumno' que borraría un objeto Alumno del array de Alumnos.
  • Un método 'eliminarProfesor' que borraría un objeto Profesor del array de Profesores.
  • Un método 'modificarAlumno' que en base a un identificador (por ejemplo el nif) buscaría el objeto alumno dentro del array de Alumnos y llamaría al método 'modificar' de ese objeto.
  • Un método 'modificarProfesor' que en base a un identificador (por ejemplo el nif) buscaría el objeto profesor dentro del array de Profesores y llamaría al método 'modificar' de ese objeto.
  • Un método 'listarAlumnos' que en base a un criterio (nombre, nif,...) recorra el array de Alumnos, mostrando aquellos objetos cuyo criterio coincida con los valores guardados en cada uno de los objetos.






POO


Clases

  • Una clase es un conjunto de datos y métodos que manejan esos datos.
  • Los datos y los métodos definen las características de algún tipo de objeto.
  • Por ejemplo, podemos describir un círculo por su pongo (x,y) de su centro y por el valor de su radio.
Cada círculo es diferente de los demás (en el centro o en la radio), pero como clase, todos los círculos tienen una serie de propiedades que sirven para dar una definición de círculo.
Es decir, una clase consta de métodos (procedimientos) y atributos (variables), que se encuentran relacionados formando un todo que llamamos clase.


  • Importante:
  • El nombre de las clases en Java debe comenzar con la primera letra en mayúsculas y las siguientes primeras letras de cada palabra si tuviera más de una. Por ejemplo: ChaletsAdosados
  • El nombre debe estar en singular


  • En Java, la creación de una clase se lleva a cabo en dos pasos: la declaración de clase y su definición.


  • La declaración general de una clase es la siguiente:
 1 access class Nombre_Clase [extends NombreClase] [implements NombreClase,....] { // Comienzo del código de la clase
 2 
 3   [access] [static] tipo variable_de_instancia1;    // Declaramos variables
 4   .....
 5   [access] [static] tipo variable_de_instanciaN;
 6   .....
 7 
 8   [access] [static] tipo método1 (lista de parámetros) {   // Declaramos métodos
 9      .....
10   }
11      .....
12   [access] [static] tipo métodoN (lista de parámetros) {
13      .....
14   }
15 } // Fin del código de la clase
Más adelante veremos qué significan todas estas palabras clave ...



Objetos

  • Una vez que se ha definido la clase del círculo, se pueden hacer cosas con ella.
Para usar los métodos y acceder a los métodos datos, se necesita un círculo específico, no sirve la clase; se requiere una instancia de la clase: un objeto Círculo.
La diferencia entre clase y objetos se puede ver al comparar un molde para hacer cookies con las cookies. El molde tiene todas las características de las cookies, pero no es ninguna galleta en particular.
Cada cookie (objeto) es una instancia de la clase de cookie (molde). El proceso de crear un objeto de una clase se llama instanciar.


  • Cada objeto tendrá un estado que estará conformado por los valores de sus atributos en un momento determinado.



Métodos

  • Los métodos son funciones que pueden llamarse dentro de la clase o por otras clases.
Son las acciones que se pueden realizar con un objeto dado.
Hay muchas cosas que se pueden hacer con círculos: calcular un circunferencia, el área, ver si un determinado punto está dentro o fuera, etc.
Para aclarar todos estos conceptos, llevaremos a cabo el siguiente ejercicio.
Supongamos que queremos implementar la siguiente clase:
Prog fund poo 1.jpg
Esta clase tiene dos atributos (variables) que son el nombre y la edad.
La forma de definir Java en esta clase es la siguiente:
1 public class Europeo { // Comienza el código de la clase 
2 
3 
4 
5 } //Termina el código de la clase
  • Nota: La clase tiene un modificador de acceso público (public) para indicar que la clase puede ser utilizada por otras clases. Más adelante revisaremos estos conceptos.
En nuestro caso, la clase Europeo tiene dos variables, que deben definirse.
Para definir una variable dentro de una clase de la manera más simple: Tipo nombre_de_variable;
En nuestro caso:
1 public class Europeo { // Comienza el código de la clase 
2   String nombre;
3   int edad;
4 
5 
6 } //Termina el código de la clase


  • Recuerda: Las variables 'miembro' (las que están definidas a nivel de clase) sí se inicializan si no les damos un valor inicial. Si son de tipo numérico se inicializan a 0, si son booleanas a false y si son de referencia o cadena se inicializan a null.
  • Recuerda: Las variables 'miembro' son 'visibles' (se puede acceder a su valor) en toda la clase.


  • En este momento, hemos definido el molde de las cookies.
Es decir, definimos la clase, pero esta clase no tiene ningún valor concreto para los atributos nombre y edad.
Los valores concretos están asociados con los objetos.
Prog fund poo 2.jpg


  • Importante: Una vez que nuestra clase está escrita, es necesario guardarla en un archivo con el mismo nombre de la clase pública, en nuestro caso Europeo y extensión .java.
Dentro de un único archivo físico, podemos haber definido varias clases. Pero de todos ellas, solo una puede tener el modificador 'public' y el archivo físico deben tener el mismo nombre que esa clase.
Prog fund poo 3.jpg


  • Si no estuviéramos en el NetBeans tendríamos que 'compilar' esta clase con la orden: javac (ya visto anteriormente).


  • Crearemos en Netbeans una clase de nombre 'Principal' que tenga el método main definido de la forma:
 1 package aprendiendo;
 2 
 3 /**
 4  *
 5  * @author clase
 6  */
 7 public class Principal {
 8 
 9     /**
10      * @param args the command line arguments
11      */
12     public static void main(String[] args) {
13         // TODO code application logic here
14     }
15     
16 }

Nota:> El nombre del paquete será diferente al vuestro.


  • Ahora, el objetivo es usar la clase Europeo dentro de la clase Principal.
Para esto crearemos (instanciaremos) 3 objetos de la clase Europeo con los siguientes datos:
Prog fund poo 4.jpg


  • ¿Cómo definimos un objeto? Para esto debemos definir un objeto de la misma manera que uno se define variable: Nombre_clase nombre_objeto;
En nuestro caso:
1 Europeos europeos1; // primer objeto 
2 Europeos europeos2; // segundo objeto 
3 Europeos europeos3  // tercer objeto


  • Este es un primer paso, pero a mayores, debemos asignar memoria a estos objetos.
Para esto, se usa el operador new, que reserva la memoria.
Este operador sería equivalente al malloc de C.
En Java no hay operador opuesto, es decir, la liberación de memoria (free en C).
Lo máximo que podemos hacer es asignar un objeto al valor nulo y es Java que a través del proceso de recolección de basura (proceso especial, garbage collection) es responsable de liberar la memoria que ya no es utilizada por ningún objeto.

En nuestro caso:

1 europeo1 = new Europeo();  // reservamos memoria 
2 europeo2 = new Europeo();  // reservamos memoria 
3 europeo3 = new Europeo();  // reservamos memoria


  • El proceso de reservar memoria se llama instanciación.
Estas operaciones se pueden hacer a la vez (definición e instanciación):
1 Europeo europeo1 = new Europeo();
En esta línea, estamos haciendo 3 operaciones:
  • Una declaración: declaramos europeo1 de tipo Europeo.
  • Una instanciación: reservamos memoria con el operador new.
  • Inicialización: más adelante veremos que cuando realizamos la creación de instancias llamamos a uno método especial (procedimiento) llamado constructor que permite inicializar todas las variables. Por defecto, ya vimos que estar variable se inicializan.
  • En este momento tenemos 3 objetos de la clase europea y, por lo tanto, cada objeto tendrá los mismos atributos que la clase a la que pertenece, en este caso dos atributos (nombre y edad).


  • ¿ Cómo asignamos valores a ditas variables ?
De la forma: obxecto.atributo = valor;
En nuestro caso:
1 europeo1.nome = Angel;
2 europeo1.idade = 20;
3 europeo2.nome = Pepe;
4 europeo2.idade = 15;
5 europeo3.nome = Jean;
6 europeo3.idade = 17;





-- Ángel D. Fernández González -- (2017).