1/31/12
1
Programación orientada a objetos
Curso INEM. Programación en Java Santiago Muelas Pascual
Introducción
! ¿Qué es la POO? ! Un paradigma de programación
! Un paradigma es una forma de afrontar la construcción código software ! No hay paradigmas mejores ni peores
! Todos tienen sus ventajas e inconvenientes
! Hay distintos paradigmas: POO, Estructurado, Funcional, Lógico, etc.
Características de la POO
! Facilidad de diseño y relación con el mundo real
! Reusabilidad y facilidad de mantenimiento
! Del lenguaje máquina hacia el mundo real
! Sistemas más complejos ! Abstracción
! Trabajo en equipo
Elementos de la POO
! Objetos: Elementos que interactúan entre sí para conseguir un fin ! Autónomos
! Con una funcionalidad concreta definida
! Instancias de una clase
! Clases: ! Especificación de un conjunto de elementos
! Todo objeto pertenece a una clase
Objetos y clases Objetos
! Los objetos tienen propiedades que los distinguen ! Comunes a todos los de su clase
! Propias de cada uno
! Los objetos representan los conceptos fundamentales del programa ! y de su interacción surge la funcionalidad
! Los objetos interactúan entre sí por medio de mensajes
1/31/12
2
¿Como funciona un programa orientado a objetos?
Cocina
No hay café
Tienda
Comprar café
Café
Buscar el café
Resumen de objetos y clases
! Clases ! Representan conceptos o entidades significativas de un
problema
! Se pueden ver como plantillas para definir elementos (objetos)
! Objetos ! Elementos con comportamiento definido en la clase y estado
concreto
! Instancias de clase
! Interactúan por medio de mensajes
Ejemplo Otros conceptos importantes
! Polimorfismo
! Herencia
! … Se verán más adelante
UML
! UML (Unified modeling language): Lenguaje unificado de modelos
! “Mapa” del código. No sirve para desarrollar sino para describir
! Se utilizan diagramas diferentes. ! 13 en UML 2.0
Declaración de clases
! Una clase en Java debe ser declarada antes de poder ser utilizada
class nombre {! cuerpo de la clase!}!
1/31/12
3
Cuerpo de la clase: atributos y métodos
! Estado: Describe la situación interna del objeto. ! Existen varias formas de definir distintos estados
! El estado distingue a los objetos de la misma clase ! Cada uno tiene su estado
! Son los atributos o variables de instancia
! Comportamiento: Describe los servicios que proporciona una clase lo que se puede hacer con ella). ! Son los métodos
Atributos o variables de instancia
! Describen el estado interno de cada objeto concreto
! Pueden ser: ! Tipos básicos (int, boolean, char, etc.)
! Arrays de elementos
! Otros objetos
tipo nombre_variable;
Métodos
! Definen el comportamiento de los objetos de una clase
! Permiten acceder y modificar a los atributos
! Devuelven (o no) un resultado
! Pueden necesitar parámetros tipo_retorno nombre (parámetros) { código }
Métodos
! Para promocionar la reusabilidad cada método debería estar limitado a realizar un tarea muy concreta ! El nombre de esa tarea tiene que expresar claramente la acción
del método
! Un método que realiza una única tarea es más sencillo de comprobar y de depurar que uno que realice varias
Métodos
! Permiten modularizar un programa separando sus tareas en unidades auto contenidas
! Ventajas: ! Divide y vencerás
! Reutilización
! Evitar duplicidad ! Facilita la depuración y el mantenimiento
! En Java todo método tiene que pertenecer a una clase ! El programa principal main es un método de una clase
Métodos
! Los objetos interactúan por medio de mensajes
! Un objeto le pide a otro que realice una acción (ejecuta el método X)
! El objeto llamado realiza la acción pudiendo devolver un resultado ! puede no devolver nada
! El objeto llamante no conoce los detalles de cómo se lleva a cabo la acción
1/31/12
4
Esquema general
Método(a1, ..., an)
a1 a2 an
...
resultado
Argumentos
Método
Valor de retorno Puede no
devolver un resultado
Uso de un método
! Se invoca proporcionando valores a los argumentos de llamada
! El valor de retorno se devuelve por medio de un return
! Se admiten métodos que no devuelvan nada ! tipo void como tipo de retorno
! Sólo con este tipo no es obligatorio usar la sentencia return
! Los métodos admiten recursividad
Métodos y atributos
• Atributos • raza: Bulldog • edad: 1 año • nombre: “Pancho” • …
• Métodos • ladra() • come() • duerme() • …
Ejemplo
public class Perro {
// Atributos
String nombre;
int edad;
// Métodos
void ladra() {
System.out.println(“Guau”);
}
void cambiarNombre(String nuevonombre){
nombre = nuevonombre;
}
}
Creación de objetos
! Por medio del operador new
NombreClase variable = new NombreClase();
! Se le pueden pasar parámetros ! Método constructor
! lo veremos en las siguientes transparencias
Acceso a atributos
! Por medio del operador .
variable.atributo;
Ej: System.out.println(miPerro.nombre);
! Dentro de un método no hace falta utilizar el operador . para acceder a un atributo o variable de instancia
1/31/12
5
Llamada a métodos
! Por medio del operador .
Ej: miPerro.ladra();
Ejemplo
public class Perro {
String nombre;
public void ladra() {
System.out.println(“GUAU”);
}
public static void main(String[] args) {
Perro miperro = new Perro();
miperro.ladra();
}
}
Ejercicio
! Utilizando la clase Perro mostrada anteriormente, crea un objeto de la clase Perro y haz que su nombre (atributo de la clase String) contenga al valor “Pancho”.
! Imprime el atributo nombre
! Crea el método dameNombre en la clase Perro que devuelva el atributo nombre.
! Imprime el resultado de llamar a este método.
Tipos primitivos vs tipos referencia
! Hasta ahora las variables podían ser del tipo: ! Tipos primitivos: int, double, char, …
! Tipo de una Clase: String, Perro, …
! (arrays)
! Una variable de un tipo primitivo contiene exáctamente un único valor del tipo especificado
! Si no se le asigna un valor al declararla, se le asigna un valor por defecto
Referencias
! Con la creación de objetos tenemos un nuevo tipo ! Referencias
! ¿Qué es una referencia? ! Una identificador para acceder al objeto
! Todas ocupan lo mismo ! Pero identifican a objetos de un
tipo determinado (Perro, String,…)
! Se utilizan para acceder a los atributos y llamar a los métodos de un objeto
! El valor por defecto es null
Referencias
Pancho
Perro miPerro = new Perro();!
miPerro.nombre = “Pancho”;!
Perro otroPerro = new Perro();!
otroPerro.nombre = “Friki”;!
!
miPerro = otroPerro;!Friki
1/31/12
6
Métodos habituales: Constructor
! Sirve para inicializar los atributos de un objeto al crearlo
! Se utiliza el nombre de la clase
! No devuelve nada por definición
NombreClase( parámetros ) { … }
Ejemplo
class Coche { String color; String modelo; Coche( String uncolor, String unmodelo ) { color = uncolor; modelo = unmodelo; } public static void main(String[] args) { Coche c = new Coche(“rojo”,”Clio”); } }
Ejercicio
! Crea el constructor para la clase Perro de manera que reciba un nombre y una edad y asigne esos valores a los atributos correspondientes.
! Crea un objeto de la clase Perro con el nuevo constructor
Métodos habituales: Constructor
! ¿Qué sucede si no declaramos un constructor? ! Siempre tiene que existir
! Se crea uno vacío por defecto
! ¿Qué sucede en este ejemplo?
class Prueba { Prueba(int a) { } public static void main(String[] args) { Prueba c = new Prueba(); } }
Inicialización de atributos o variables de instancia
! Para que los atributos de los objetos que se creen siempre tomen el mismo valor
class Cuenta { int saldo = 100; }
La referencia this
! Dentro de un método, la palabra reservada this representa a la referencia al objeto actual
! Lo pasa el compilador como el primer argumento implícito de cada llamada de un método
! Se utiliza implícitamente para hacer referencia tanto a los atributos como a los métodos
! También se puede utilizar de manera explícita
1/31/12
7
Ejemplo
public class Perro {
String nombre;
Perro(String nombre) {
this.nombre = nombre;
}
}
Sobrecarga de métodos
! Varias declaraciones de un método con el mismo nombre
! Distintas implementaciones en función de los parámetros recibidos
! Se puede aplicar al constructor
Sobrecarga: Ejemplo
class Perro { String nombre; int edad; Perro(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } Perro(String nombre) { this.nombre = nombre; this.edad = 0; } }
Ejercicio
! Crea para la clase Perro mostrada anteriormente un método ladra que imprima GUAU y otra versión sobrecargada que imprima el parámetro de tipo String que reciba de entrada.
Sobrecarga
! Métodos con el mismo nombre pero con distinto parámetros de entrada
! ¡OJO! El tipo de retorno puede cambiar ! Pero sólo si los parámetros de entrada son distintos
! No puede haber dos métodos con el mismo nombre, los mismos parámetros de entrada pero distinto tipo de salida.